小编典典

如何修复“不正确的字符串值”错误?

all

在注意到应用程序由于不正确的字符串值错误而倾向于丢弃随机电子邮件后,我尝试并切换了许多文本列以使用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
相当不熟悉,也不知道这样的修复是否有意义。


阅读 103

收藏
2022-07-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 编码,但听起来你不是太在意这个?

2022-07-17