java - 全新安装的 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 的问题,但是由于系统之间的不一致,混淆仍然存在。
解决方案
D8B4D984D8A7D8A4
是正确的 utf8(或 utf8mb4)编码شلاؤ
。 C398C2B4C399C284C398C2A7C398C2A4
是“双编码”版本。这意味着某些东西仍在将“latin1”指定为字符集。也许您转储并重新加载了数据,这就是它发生的地方?
有关此类的更多信息,请参阅UTF-8 字符问题;我看到的不是我存储的,也许是http://mysql.rjweb.org/doc.php/charcoll
推荐阅读
- python - 如何删除 Tkinter 菜单小部件(Python 3)中烦人的默认边框?
- swift - Swift Set Fix Alignment 在任何 iphone 尺寸上
- c# - 来自 c# 的 AutoCAD 运行命令
- npm - npm-live-server https 命令行配置?
- sql-server - 无效的参考格式:在 MAC 上运行 Docker 以在容器中包含 SQL Server 2019
- c++ - 涵盖 boost::trim 并接受 std::vector 的函数
- javascript - 如果我可以只用 nodejs 本身做所有事情,我为什么要使用 Express?
- azure - 向 Azure Synapse Analytics Workspace 添加新用户时需要哪些权限?
- python - 有没有办法通过按下按钮来使用 tkinter 创建标签
- javascript - 如何在 100% 堆积条形图中按值对颜色段进行排序,而不是按 Highcharts 或 ChartJs 中所有堆积条形图的值排序