一尘不染

如何解决“字符串值错误”错误?

mysql

在注意到一个应用程序倾向于由于不正确的字符串值错误而丢弃随机电子邮件之后,我经过了并切换了许多文本列以使用utf8列字符集和默认列归类(utf8_general_ci),以便它可以接受它们。这修复了大多数错误,并使应用程序在遇到非拉丁电子邮件时也停止出现sql错误。

尽管如此,某些电子邮件仍然导致程序遇到不正确的字符串值错误: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)

内容列是MEDIUMTEXT使用utf8列字符集和utf8_general_ci列排序规则的数据类型。在此列中没有可切换的标志。

请记住,除非绝对必要,否则我不想触摸甚至查看应用程序源代码:

  • 是什么导致该错误?(是的,我知道电子邮件中到处都是随机垃圾,但我认为utf8可以允许)
  • 我该如何解决?
  • 此修复程序可能产生什么影响?

我考虑的一件事是在打开二进制标志的情况下切换到utf8 varchar([some large
number]),但我对MySQL并不熟悉,也不知道这样的修复是否有意义。


阅读 393

收藏
2020-05-17

共1个答案

一尘不染

"\xE4\xC5\xCC\xC9\xD3\xD8"无效的UTF-8。使用Python测试:

>>> "\xE4\xC5\xCC\xC9\xD3\xD8".decode("utf-8")
...
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

如果您正在寻找避免解码数据库中错误的方法,则cp1252编码(又称“ Windows-1252”或“ Windows Western
European”)是最宽松的编码-每个字节值都是一个有效的代码点。

当然,它不再会理解真正的UTF-8,也不会理解任何其他非cp1252编码,但是听起来您不太在意这一点?

2020-05-17