在注意到一个应用程序倾向于由于不正确的字符串值错误而丢弃随机电子邮件之后,我经过了并切换了许多文本列以使用utf8列字符集和默认列归类(utf8_general_ci),以便它可以接受它们。这修复了大多数错误,并使应用程序在遇到非拉丁电子邮件时也停止出现sql错误。
utf8
utf8_general_ci
尽管如此,某些电子邮件仍然导致程序遇到不正确的字符串值错误: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)
(Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)
内容列是MEDIUMTEXT使用utf8列字符集和utf8_general_ci列排序规则的数据类型。在此列中没有可切换的标志。
MEDIUMTEXT
请记住,除非绝对必要,否则我不想触摸甚至查看应用程序源代码:
我考虑的一件事是在打开二进制标志的情况下切换到utf8 varchar([some large number]),但我对MySQL并不熟悉,也不知道这样的修复是否有意义。
"\xE4\xC5\xCC\xC9\xD3\xD8"无效的UTF-8。使用Python测试:
"\xE4\xC5\xCC\xC9\xD3\xD8"
>>> "\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编码,但是听起来您不太在意这一点?