Mysql UTF8 编码问题 - “不正确的字符串值”

Posted

技术标签:

【中文标题】Mysql UTF8 编码问题 - “不正确的字符串值”【英文标题】:Mysql UTF8 Encoding Issue - "Incorrect string value" 【发布时间】: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:唯一重要的是列的字符集? 【参考方案1】:

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

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

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

【讨论】:

error message 表明字符串在连接字符集中是 valid 的(否则会看到 ER_INVALID_CHARACTER_STRING),但不在列中(OP 说他试过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 提到的,列字符集和排序规则很重要,我已经设置了所有默认值,因此我以后不会更新所有新列。

【讨论】:

以上是关于Mysql UTF8 编码问题 - “不正确的字符串值”的主要内容,如果未能解决你的问题,请参考以下文章

MySQL抛出不正确的字符串值错误

将 UTF-8 编码的字符串插入 UTF-8 编码的 mysql 表失败​​,并显示“字符串值不正确”

Mysql2::Error: 不正确的字符串值

如何设置MySQL表的某字段编码为utf8?急!

MySQL设置默认编码集为utf8怎么设置

MySQL UTF8/ASCII/ISO 编码问题