使用go-mysql-driver插入字符串报Error 1366错误求助
问题描述
使用go-mysql-driver向MySQL表插入字符串时遇到Error 1366错误,错误信息如下:
Error 1366: Incorrect string value: '\xA7test for column
mycolumnat row 1
数据库连接代码:
db, err := sql.Open("mysql", "username:pass@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4")
查询表字符集结果显示表为utf8mb4:
--------------------- | mytable | utf8mb4 | ---------------------
尝试插入的字符串为§test,已设置utf8mb4字符集但问题仍未解决。
解决方案
1. 检查目标列的字符集
表的字符集为utf8mb4不代表列的字符集一致。执行以下SQL确认mycolumn的字符集:
SELECT column_name, character_set_name FROM information_schema.columns WHERE table_name = 'mytable' AND column_name = 'mycolumn';
若列字符集不是utf8mb4,执行修改语句:
ALTER TABLE mytable MODIFY COLUMN mycolumn VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 验证连接字符集是否生效
连接参数charset=utf8mb4可能未正确生效,连接后执行以下SQL确认当前连接字符集:
SHOW VARIABLES LIKE 'character_set_connection';
若结果不是utf8mb4,可在连接字符串中添加collation=utf8mb4_unicode_ci,或连接后手动设置:
_, err := db.Exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci") if err != nil { // 处理错误逻辑 }
3. 确保插入字符串为UTF-8编码
错误信息中\xA7是单字节ISO-8859-1编码的§,而UTF-8编码应为\xC2\xA7。若字符串来自非UTF-8来源(如文件、旧系统),需转换为UTF-8:
// 示例:将ISO-8859-1编码字符串转为UTF-8 import "github.com/djimenez/iconv-go" isoStr := "§test" utf8Str, err := iconv.ConvertString(isoStr, "ISO-8859-1", "UTF-8") if err != nil { // 处理转换错误 } // 使用utf8Str执行插入操作
4. 使用参数化查询
避免直接拼接SQL字符串,参数化查询可让驱动自动处理编码问题:
_, err := db.Exec("INSERT INTO mytable (mycolumn) VALUES (?)", "§test") if err != nil { // 处理插入错误 }
内容的提问来源于stack exchange,提问作者VpnUser4
相关产品推荐
相关产品推荐

