docker部署的mysql容器数据插入中文乱码问题及其衍生问题

docker部署的mysql容器数据插入中文乱码问题及其衍生问题

前言:笔者使用的mysql时部署在docker容器中的,版本是5.5
部分内容参考了
https://blog.csdn.net/weixin_42168191/article/details/103159920?utm_medium=distribute.pc_relevant.none-task-blog-title-7&spm=1001.2101.3001.4242A往复随安
https://www.cnblogs.com/tian874540961/p/12133469.html --健人雄
遇到的问题:中文数据的入参接收是没有问题的,在写入数据库的时候乱码了
在这里插入图片描述

经排查,发现docker拉取部署的mysql,客户端与连接默认都是latin1
在这里插入图片描述

解决方案:
1.先解决外部访问乱码问题
由于使用的docker部署,需要先进入mysql容器内部 docker exec -it 容器id(或者容器名) /bin/bash
官方解释:
exec: Run a command in a running container(在运行的容器中运行命令)
exec -i: --interactive(相互作用的) Keep STDIN open even if not attached(即使没有连接,也要保持STDIN打开)
exec -t: --tty Allocate a pseudo-TTY(分配一个 冒充的终端设备)
进入mysql容器内部后,登陆数据库 mysql -uroot -p 输入密码
之后先查看当前的编码show variables like ‘character%’;show variables like ‘collation%’;
发现客户端与连接默认都是latin1,我们统一编码为utf8
set names ‘utf8’;这句话是设置了三个值:
set character_set_client = utf8; set character_set_results = utf8; set character_set_connection = utf8;
2.修改mysql的配置文件
退出数据库登陆,重新进入mysql容器,cd到容器的 /etc/mysql下
在这里插入图片描述

使用vim命令修改my.cnf文件,但可能会出现vim:command not found的错误,别担心,初次进入容器是这样的,没有该命令我们自己安装,执行apt-get update,更新完毕后执行apt-get install vim
现在我们可以使用vim命令了,编辑my.cnf文件 vim my.cnf,不同版本命名可能不同,你的可能叫mysqld.cnf或者xxx.cnf
笔者的my.cnf刚进去只有
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
修改为以下内容… (此处来源于网上百度,这里有坑!慎重慎重慎重!具体坑后面会填平,请先耐心往下看)
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
default-character-set = utf8(注意:这里是坑)
[mysql.server]
default-character-set = utf8
[mysqld_safe]
default-character-set = utf8
[client]
default-character-set = utf8
改完按Esc,然后输入:wq保存并退出
到这里你还是有可能会出现中文插入乱码问题,是不是心态爆炸?别急,检查一下你的jdbc url
jdbc:mysql://ip:端口/库名?useUnicode=true&characterEncoding=UTF8
jdbc蓝色部分这里需要指定一下编码跟数据库对应, 额外延伸:如果插入涉及到时间问题,还需要统一一下时区
再次测试调接口插入中文,你会发现docker部署的mysql中文乱码问题解决!
在这里插入图片描述

特别提醒:如果按照以上操作还出现中文乱码问题(虽然不太可能但万一呢?),尝试把mysql的客户端工具连接删除重新连接一下!


拓展:笔者在解决上述中文乱码问题时遇到的坑,如下
当你修改mysql的配置后,需要对mysql进行重启才能永久生效
在这里插入图片描述


但是当我进行restart操作后,mysql重启失败了,让我们查看一下日志docker logs 容器id
在这里插入图片描述

根据日志报错合理猜测时由于default-character-set = utf8导致的错误,但此时mysql容器启动不了了,就更别提进入容器内进行修改配置文件了.
解决方案如下:使用docker cp命令,把docker容器中的配置文件复制到主机中来,然后修改完再复制到docker容器中去就可以了
具体操作:
1.将docker容器内的配置文件拷贝出来 docker cp mysql:/etc/mysql/my.cnf .
注意: .代表当前目录
2.vim 修改配置文件中出错的地方 根据日志提示,删除mysqld下的未知变量 default-character-set = utf8
在这里插入图片描述

3.复制修改后的配置文件到docker容器中去 docker cp my.cnf mysql:/etc/mysql/my.cnf
4.重启容器实例 docker restart 容器id
启动成功!
在这里插入图片描述

---------这里是一个小小小的小问题---------
当你在修改my.cnf的过程中,非正常关闭会出现xxx.swp文件
在这里插入图片描述
这是由于非正常关闭导致的版本重复问题,虽然不会有什么实际影响,但每次一打开都会出现在这里插入图片描述

这个时候如果你修改完文件后,你可以使用rm删除swp文件,世界一下子就清净了
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值