我们正在运行Etherpad Lite,并试图将数据库从MySQL迁移到PostgreSQL。
MySQL数据库“值”列的类型为utf8mb4。但是,大约10%的行包含的值实际上是用Windows1252或ISO-8859-15编码的,而不是UTF-8。这怎麽可能?在将UTF-8输入列之前,MySQL不验证它吗?
PostgreSQL在迁移过程中不能接受无效的值,因为它确实验证了数据并命中了原始字节0xE4 (ISO-8859-15:ä),应该在UTF-8中将其编码为字节序列0xC3 0xA4。
这是MySQL已知的“特性”吗?有没有任何方法总是从utf8mb4列中得到真正的UTF-8?
发布于 2020-10-20 12:23:23
不知道解决方案。,这可能是MySQL中的一个bug,如果客户端连接和列类型都是utf8mb4,则不允许存储非UTF-8数据。
我不再使用MySQL来做任何事情,所以我不再费心去想这个bug了。现在,我用PostgreSQL来代替一切。
发布于 2017-09-06 19:30:54
如果
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%的例子的十六进制。并在插入前在客户端提供十六进制,插入后在表中提供十六进制。
https://stackoverflow.com/questions/46075120
复制相似问题