我插入字符串到我的数据库,但得到MySQL 1366错误无效字符串字节序列。
2016/11/04 13:33:40 Error 1366: Incorrect string value: 'x89PNGx0Dx0A...' for column 'text' at row 1
2016/11/04 13:33:56 Error 1366: Incorrect string value: 'xB6xEBxE4x0Bx92xEE...' for column 'text' at row 1
2016/11/04 13:33:56 Error 1366: Incorrect string value: 'xFFxD8xFFxE0x00x10...' for column 'text' at row 1
2016/11/04 13:34:35 Error 1366: Incorrect string value: 'x9C]x91xD1kxC2...' 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;")
我还错过了什么?
这些不是有效的UTF-8字符串;这些都是二进制数据(第一个是PNG文件!)您需要将它们存储在真正的二进制列中,因为MySQL确实执行特定于utf -8的操作,如大小写折叠和语言排序。(Go不会对字符串强制使用UTF-8编码,所以Go不会抱怨。Go只使用UTF-8编码字符串字面值,但x
转义序列覆盖了这一点。当然,range
, []rune
转换和各种包都假定字符串是UTF-8。
您可以使用utf8.ValidString()
检查字符串是否为有效序列。
为包含图像的列使用BLOB
(可能是MEDIUMBLOB
)数据类型。使用TEXT
导致检查编码。PNG不包含正确编码的utf8字符,因此出现错误。