我们正在运行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?
答案 0 :(得分:0)
如果
latin1
(等),E4
然后一切都很好。 E4
将在INSERT
期间转换为C3A4
,这就是存储的内容。请SELECT HEX(...) ...
进行验证。
如果
C3A4
同样,一切都很顺利。 C3A4
直接进入表格。
这是一个混乱的案例:
如果
latin1
和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代替所有内容。