「这是我参与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_client,character_set_connection,character_set_database,character_set_results,character_set_server 这几个key的值是utf8mb4就可以了;
问题记录完了,再见。
\