【问题标题】:Mysql UTF8 Encoding Issue - "Incorrect string value"Mysql UTF8 编码问题 - “不正确的字符串值”
【发布时间】:2012-12-02 05:24:22
【问题描述】:

我正在使用带有 .Net 连接器 (6.5.4) 的 Mysql (5.5.27),当我尝试插入一些数据时,出现以下错误。

Incorrect string value: '\xF3\xB6\xA5\x89f'...' for column 'STACK_TRACE' at row 1

我已经在堆栈溢出方面进行了足够多的搜索,并尝试按照数据库、表和列的字符集和排序规则。

  • 'utf8' 'utf8_general_ci'
  • 'utf8' 'utf8_unicode_ci'
  • 'utf8mb4' 'utf8mb4_general_ci'
  • 'utf8mb4' 'utf8mb4_unicode_ci'

我已在连接字符串中正确设置了 'charset=utf8'。

  • 那个特定的 unicode 字符有什么问题吗?我无法控制这些数据,这些数据是从许多 Android 手机中收集的。
  • 是mysql的bug吗?

【问题讨论】:

  • 当您将表以及数据库和列全部设置为'utf8mb4',并将排序规则设置为'utf8mb4_unicode_ci'时,您能否确认错误仍然存​​在?我只是确定您尝试过这种情况,而不仅仅是字符集和排序规则排列的示例。
  • @JimDeLaHunt:唯一重要的是列的字符集?

标签: .net mysql


【解决方案1】:

来自文档 - 名为 utf8 的字符集每个字符最多使用三个字节,并且仅包含 BMP 字符。从 MySQL 5.5.3 开始,utf8mb4 字符集每个字符最多使用四个字节,支持补充字符...

The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

如果您需要使用 4 字节 UTF,则更改表字段 - 设置 utf8mb4 字符集,并设置连接 - SET NAMES utf8mb4。

【讨论】:

【解决方案2】:

字节序列\xF3\xB6\xA5\x89 似乎是字符 U+F6949(私人使用字符)的有效 UTF-8 字节序列。请注意,此字符位于补充平面中,需要一个 4 字节的 UTF-8 序列来表示它。

MySQL documentation 10.1.10. Unicode Support 指出,在 MySQL 5.5.3 之前,字符集“utf8”仅支持“每个字符一到三个字节”。您使用的是 MySQL 5.5.27(感谢您的注意),因此 MySQL 可以处理此字符——但您必须使用新的编码:“utf8mb4,Unicode 字符集的 UTF-8 编码,使用一到四个字节每个字符”。还使用排序规则的utf8mb4 变体。此外,“需要使用 Unicode 与服务器通信的客户端应用程序应相应地设置客户端字符集;例如,通过发出 SET NAMES 'utf8' 语句。”

不要忘记将列设置为utf8mb4。错误消息“列的字符串值不正确...”暗示这可能是您的问题。 MySQL bug report #30131 "Incorrect string value" error (1366) when inserting special characters 似乎是类似的情况。最后的评论写道:“这个问题很容易解决。不要忘记不仅将数据库、表和排序规则设置为 utf8,而且还要设置列!这就是我遇到问题的原因。我用拉丁语创建了表,然后切换转为 utf8,但忘记更改列。”

Stack Overflow question “Incorrect string value” when trying to insert UTF-8 into MySQL via JDBC? 似乎是关于类似的问题。

【讨论】:

  • error message 表明字符串在连接字符集中是 valid 的(否则会看到 ER_INVALID_CHARACTER_STRING),但不在列中(OP 说他试过utf8mb4)。
  • 修改现有列为我修复了它。谢谢
【解决方案3】:

我已经通过以下更改解决了这个问题。

  • 使用“;CharSet=utf8mb4;”在连接字符串中。我之前错过了这个。我使用的是“utf8”。
  • 将数据库的默认字符集、表的默认字符集和所有列的字符集设置为'utf8mb4'
  • 将数据库的默认排序规则、表的默认排序规则和所有列的排序规则设置为“utf8mb4_unicode_ci”

正如@eggyal 提到的,列字符集和排序规则很重要,我已经设置了所有默认值,因此我以后不会更新所有新列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多