【问题标题】:Golang MySQL 1366 incorrect string value errorGolang MySQL 1366 不正确的字符串值错误
【发布时间】:2017-03-18 15:39:13
【问题描述】:

我正在向我的数据库中插入字符串,但由于字符串字节序列无效而出现 MySQL 1366 错误。

2016/11/04 13:33:40 Error 1366: Incorrect string value: '\x89PNG\x0D\x0A...' for column 'text' at row 1
2016/11/04 13:33:56 Error 1366: Incorrect string value: '\xB6\xEB\xE4\x0B\x92\xEE...' for column 'text' at row 1
2016/11/04 13:33:56 Error 1366: Incorrect string value: '\xFF\xD8\xFF\xE0\x00\x10...' for column 'text' at row 1
2016/11/04 13:34:35 Error 1366: Incorrect string value: '\x9C]\x91\xD1k\xC2...' for column 'text' at row 1

我的 MySQL 配置设置为 utf8mb4,如下所示:

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

我的数据库连接池如下所示:

db, err = sql.Open("mysql", config.User+":"+config.Password+"@tcp("+config.Host+")/"+config.Database)
if err != nil {
    log.Fatal(err)
}

db.Exec("SET NAMES 'utf8mb4'; SET CHARACTER SET utf8mb4;")

我还缺少什么?

【问题讨论】:

  • 我遇到了同样的问题,结果发现,不知何故,控制字符被引入到字符串中(在我的特殊情况下,当从 MS-Word 复制 formatted 文本时进入我的网页的输入字段)。就我而言,解决方案是在客户端过滤掉控制字符。

标签: mysql go utf8mb4


【解决方案1】:

那些不是有效的 UTF-8 字符串;这些是二进制数据(第一个是 PNG 文件!)。您需要将它们存储在一个真正的二进制列中,因为 MySQL 确实执行 UTF-8 特定的操作,例如大小写折叠和语言排序。 (Go 不对字符串强制执行 UTF-8 编码,因此 Go 不会抱怨。Go 仅使用 UTF-8 对字符串文字进行编码,但 \x 转义序列会覆盖这一点。当然,range、@987654324 @ 转换,并且各种包都假定字符串是 UTF-8。)

您可以使用utf8.ValidString() 来检查字符串是否为有效序列。

【讨论】:

    【解决方案2】:

    对包含图像的列使用BLOB(可能是MEDIUMBLOB)数据类型。使用TEXT 会导致检查编码。 PNG 不包含正确编码的 utf8 字符,因此会出现错误。

    utf8mb4 的其余用法可能没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2019-05-27
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多