Golang MySQL 1366错误的字符串值错误

时间:2016-11-04 17:44:49

标签: mysql go utf8mb4

我将字符串插入到我的数据库中,但是因为无效的字符串字节序列而导致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;")

我还缺少什么?

2 个答案:

答案 0 :(得分:4)

那些不是有效的UTF-8字符串;那些是二进制数据(第一个是PNG文件!)。您需要将它们存储在真正的二进制列中,因为MySQL确实执行了特定于UTF-8的操作,例如案例折叠和语言校对。 (Go不对字符串强制执行UTF-8编码,因此Go不会抱怨.Go仅使用UTF-8编码字符串文字,但1234转义序列会覆盖此字符串。当然,{{ 1}},\x转换,以及各种包假设字符串为UTF-8。)

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

答案 1 :(得分:1)

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

你对utf8mb4的其余用法可能还不错。