首页 > 解决方案 > 全新安装的 Ubuntu 16.04 LTS 服务器和升级的服务器之间的编码问题

问题描述

作为项目的一部分,我们需要从 Ubuntu 14.04 迁移到 Ubuntu 16.04。但是,自从升级完成后,所有功能都无法正常工作。当存储在数据库中时,字符的编码是混乱的。该软件的相同 debian 版本会产生不同的结果,这意味着 ISO 问题与不同的库或 Java 行为的某些差异。

升级后的服务器没有遇到任何问题,并且仅在较新的安装时仍然存在,这意味着 ISO 级别存在问题,但没有明显迹象表明哪个库或类似文件可能安装失败。

添加了日志记录以打印接收到的字节,Java 仍然按预期读取它。但是,当它将它们存储在数据库中时,它们就完全不同了。这是通过前面的 JPA 连接设置完成的。这已经在使用 'useUnicode=true&characterEncoding=UTF-8' 字段。当 Java 再次读取此数据时,它仍然认为它使用了正确的字节,而实际上并非如此。同样,如果您直接向数据库添加内容,Java 的调试日志不会显示正确的字节,但通过只能通过此处的接口显示时,信息仍然正确显示。这意味着问题在于存储数据而不是处理数据,但相同版本的 debian 安装会影响两个版本。

شلاؤ,例如阿拉伯语应该被编码为(通过使用 mysql/mariadb 中的十六进制函数),在正确的版本中显示为“D8B4D984D8A7D8A4”,但在不正确的版本中显示为“C398C2B4C399C284C398C2A7C398C2A4”。这可能会提供有关编码无法正常工作的原因的更多信息。如果 Java 读取错误字节就好像它们是正确的一样,这很可能是 Java 的问题,但是由于系统之间的不一致,混淆仍然存在。

标签: javajpamariadb

解决方案


D8B4D984D8A7D8A4是正确的 utf8(或 utf8mb4)编码شلاؤC398C2B4C399C284C398C2A7C398C2A4是“双编码”版本。这意味着某些东西仍在将“latin1”指定为字符集。也许您转储并重新加载了数据,这就是它发生的地方?

有关此类的更多信息,请参阅UTF-8 字符问题;我看到的不是我存储的,也许是http://mysql.rjweb.org/doc.php/charcoll


推荐阅读