如何调试Etherpad Lite数据库中的MySQL utf8mb4列中的无效数据

时间:2017-09-06 12:22:02

标签: mysql utf-8 utf8mb4 invalid-characters etherpad

我们正在运行Etherpad Lite,我们正在尝试将数据库从MySQL迁移到PostgreSQL。

MySQL数据库'价值'列的类型为utf8mb4。但是,大约10%的行包含实际上以Windows-1252或ISO-8859-15而不是UTF-8编码的值。这怎么可能?在将UTF-8输入列之前,MySQL是否验证了UTF-8?

PostgreSQL在迁移过程中无法接受无效值,因为它确实验证了数据并点击了原始字节0xE4(ISO-8859-15:ä),应编码为UTF-8中的字节序列0xC3 0xA4。

这是一个已知的"功能" MySQL?有没有办法永远从utf8mb4列获得真正的UTF-8?

2 个答案:

答案 0 :(得分:0)

如果

  • 您说客户端正在使用latin1(等),
  • 你说是utf8(或utf8mb4),
  • 您提供了十六进制E4

然后一切都很好。 E4将在INSERT期间转换为C3A4,这就是存储的内容。请SELECT HEX(...) ...进行验证。

如果

  • 你说客户端正在使用utf8(或utf8mb4),
  • 你说是utf8(或utf8mb4),
  • 您提供了十六进制C3A4

同样,一切都很顺利。 C3A4直接进入表格。

这是一个混乱的案例:

如果

  • 您说客户端正在使用latin1
  • 你说是utf8(或utf8mb4),
  • 您提供了十六进制C3A4

然后,MySQL有义务将两个字符(C3和A4)转换为utf8,产生C383C2A4。我称之为"双重编码"。

遵循Trouble with UTF-8 characters; what I see is not what I stored中的最佳做法,并使用其建议的方式来测试数据。然后回来了解更多细节。

对10%的数据进行错误解释的唯一方法可能是10%的数据被不同地编码。因此,请提供10%示例和90%示例的十六进制。并在插入之前在客户端中提供十六进制,并在插入之后在表中提供。

答案 1 :(得分:0)

未知的解决方案。这可能是MySQL中的一个错误,如果 client 连接和列类型< / em>都是utf8mb4。

我不再将MySQL用于任何事情,因此我不再费心尝试找出这个错误。如今,我使用PostgreSQL代替所有内容。