在注意到应用程序由于不正确的字符串值错误而倾向于丢弃随机电子邮件后,我尝试并切换了许多文本列以使用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 编码,但听起来你不是太在意这个?