首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调试Etherpad Lite数据库中MySQL utf8mb4列中的无效数据

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

Stack Overflow用户
提问于 2017-09-06 12:22:01
回答 2查看 455关注 0票数 0

我们正在运行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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-20 12:23:23

不知道解决方案。,这可能是MySQL中的一个bug,如果客户端连接和列类型都是utf8mb4,则不允许存储非UTF-8数据。

我不再使用MySQL来做任何事情,所以我不再费心去想这个bug了。现在,我用PostgreSQL来代替一切。

票数 0
EN

Stack Overflow用户

发布于 2017-09-06 19:30:54

如果

  • 您说客户端正在使用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%的例子的十六进制。并在插入前在客户端提供十六进制,插入后在表中提供十六进制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46075120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档