Mysql UTF8编码问题 - "字符串值不正确"

时间:2012-12-14 08:05:15

标签: .net mysql

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

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

我已经对堆栈溢出进行了足够的搜索,并尝试了以下charset&数据库,表和列的排序规则。

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

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

  • 那个特定的unicode角色有什么问题吗?我无法控制数据,它是从很多Android手机中收集的。
  • 是mysql bug吗?

4 个答案:

答案 0 :(得分:8)

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

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

正如@eggyal所提到的,列charset和collat​​ion只是重要的,我已经设置了所有默认值,所以我以后没有更新所有新列。

答案 1 :(得分: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?似乎是一个类似的问题。

答案 2 :(得分:0)

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

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

如果你需要使用4字节的UTF,那么改变表字段 - 设置utf8mb4字符集,并设置连接 - SET NAMES utf8mb4

答案 3 :(得分:-1)

将您遇到问题的参数类型更改为LONGBLOB。 MySQL将负责其余部分。