mysql插入中文 invliad value 错误踩坑记录
背景:
在部署线上服务时,考虑到线上数据的安全性,所以在测试时我们拟定先在本地启动一个测试环境来模拟线上数据库操作。自然而然我们需要先在本地启动一个 mysql 的 docker image,然后我在连接到本地 mysql 并插入中文到特定的表时, mysql 很惊异的发出了错误信息:
1 | [HY000][1366] Incorrect string value: '\xE4\xB8\xAD\xE5\x9B\xBD' for column 'region' at row 1 |
这个错误在网上 google 的信息一大堆,但我在尝试了半天之后并没有发现可用的结果,总结起来网上的解决方案无非就是三种:
- 进入到 mysql 的安装目录,修改配置文件的编码,并重启服务
- 在写入 sql 时加上前缀
SET NAMES 'utf8';SET CHARACTER SET utf8;
的方法 - 在连接 mysql 时加上
utf-8
编码方式
但我经过尝试之后,都没有成功的解决问题,归根结底这就是一个字符编码的问题,
所以我使用了下面的命令来查询我本地的 mysql 表的编码方式:
1 | show full columns from your_table_name |
得到显示的结果:
可以看到 mysql 对我的表使用的是 latin1_swedish_ci
编码方式,而这种的编码方式只能存储一个字节的内容,我们的中文当然不能存下。
而至于为什么 mysql 使用latin1_swedish_ci
作为默认的编码方式,可以看 stackoverflow 的这片问答: Why does MySQL use latin1_swedish_ci as the default?
解决方案
所以最后的解决方案为,修改 table 的编码方式为 utf8
, 这样就可以插入中文了。
我们使用下面的两条命令来修改当前 mysql 的编码方式:1
2ALTER DATABASE your_db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE your_db_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
可以参考 stackoverflow 上的这篇文章:convert-mysql-latin1-swedish-ci-to-utf8-bin
然后查看当前的编码方式:
显示当前的字符已经成功转为需要的格式,就可以正式插入中文了。
done!