3

我正在使用带有 .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 字符有什么问题吗?我无法控制数据,它是从很多安卓手机中收集的。
  • 它是mysql错误吗?
4

3 回答 3

13

通过进行以下更改,我已经解决了它。

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

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

于 2012-12-26T16:18:34.263 回答
3

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

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

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

尝试通过 JDBC 将 UTF-8 插入 MySQL 时出现堆栈溢出问题“字符串值不正确”?似乎是关于类似的问题。

于 2012-12-14T08:31:16.800 回答
0

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

utf8mb4 字符集(4 字节 UTF-8 Unicode 编码)

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

于 2012-12-14T08:19:57.453 回答