mysql不能存储表情问题记录

145 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

起因:

公司测试同事上报说执行自动化测试用例集时报出了异常错误。于是通过层层筛查,将问题定位在数据库存储上面。

仔细查看错误提示信息,incorrect string value 很明显字符串的值不正确,所以考虑是插入数据的时候是不是包含了表情符号(别问为什么一下子就想到是表情符号,问就是踩过的坑实在太多了),因为数据库的编码用的utf8只支持3字节的数据,而表情符号一般都是4个字节的字符,如果直接往数据库里插入有表情的数据,就会报这个一场,问了执行的同事证实了我的猜测,问题原因明确了。

解决

需要修改mysql的my.cnf文件,linux系统一般是在/ect/mysql/my.cnf这个位置,由于我的mysql是起的docker容器所以先要进入容器

docker exec -it 容器id /bin/bash

进入容器后在用vim命令进入/ect/mysql/my.cnf文件,添加以下信息

[client] 
default-character-set = utf8mb4 
[mysql] 
default-character-set = utf8mb4 
[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
init_connect='SET NAMES utf8mb4'

容器中自带没有vim命令,需要手动安装

apt-get install vim

不知道是不是个例,我改完上面的内容之后,数据库的时区不对了,时间会比当前时间慢8个小时,所以有可能需要重新设置一下时区set global time_zone='+8:00' 立即生效 flush privileges

改完之后重启这个容器

docker restart 容器id

修改数据库连接的配置,增加一个autoReconnect=true参数

jdbc:mysql://ip:端口/数据库?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&autoReconnect=true&useSSL=false

检查变量是不是设置成功,在服务器终端登录mysql,然后输入mysql的下列命令行查询。

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

character_set_clientcharacter_set_connectioncharacter_set_databasecharacter_set_resultscharacter_set_server 这几个key的值是utf8mb4就可以了;

问题记录完了,再见。

\