在之前的文章里面介绍了,而在先使用nactive数据库管理软件添加数据,而通过终端命令行查询数据时发现中文乱码了。如下图所示:
mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A
Database changed mysql> select * from user; +----+------+ | id | name | +----+------+ | ?1 | ?? ? | +----+------+ 1 row in set (0.00 sec)
可以判断数据库的字符集出现问题。
原因分析
1、登录mysql容器
[root@localhost docker]# docker exec -it 6f932c8097ef /bin/sh sh-4.2# mysql -u root -p Enter password:
2、查看MySQL的编码
mysql> show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name ? ? ? ? ? | Value ? ? ? ? ? ? ? ? ? ? | +--------------------------+----------------------------+ | character_set_client ? ? | latin1 ? ? ? ? ? ? ? ? ? ? | | character_set_connection | latin1 ? ? ? ? ? ? ? ? ? ? | | character_set_database ? | latin1 ? ? ? ? ? ? ? ? ? ? | | character_set_filesystem | binary ? ? ? ? ? ? ? ? ? ? | | character_set_results ? | latin1 ? ? ? ? ? ? ? ? ? ? | | character_set_server ? ? | latin1 ? ? ? ? ? ? ? ? ? ? | | character_set_system ? ? | utf8 ? ? ? ? ? ? ? ? ? ? ? | | character_sets_dir ? ? ? | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec)
可以看到编码都是latin1,latin1编码是单字节编码,向下兼容ASCII,latin1是默认编码,但不支持中文,我们需要修改它的编码方式为utf8。
解决方案
修改配置文件的编码:
1、mysql容器安装vim,docker默认环境没有安装:
[root@localhost ~]# docker exec -it 6f932c8097ef /bin/sh sh-4.2# yum -y install vim* sh-4.2# vim --version VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Dec 15 2020 08:44:59)
2、查找配置文件位置并修改配置文件(参考docker mysql文档)
[root@localhost ~]# docker exec -it 6f932c8097ef /bin/sh sh-4.2# mysql --help | grep my.cnf ? ? ? ? ? ? ? ? ? ? order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
经过测试上面显示4个后缀名为cnf的配置文件都可以修改,重启后都能正常更新。我这里选择修改/etc/my.cnf文件:
#vim /etc/mysql/my.cnf #vim /usr/etc/my.cnf #vim ~/.my.cnf sh-4.2# vim /etc/my.cnf
将以下代码添加到my.cnf相应位置:
[mysql] default-character-set=utf8 [mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 [client] default-character-set=utf8
配置如下所示:
# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysql] default-character-set=utf8
[mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/run/mysqld/mysqld.sock secure-file-priv=/var/lib/mysql-files user=mysql
collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8
# Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0
#log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [client] socket=/var/run/mysqld/mysqld.sock default-character-set=utf8
!includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ "/etc/my.cnf" 43L, 1315C ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
输入:wq保存,退出mysql容器
3、重启mysql容器
#重启mysql容器 [root@localhost ~]# docker stop ba353b8cce56 ba353b8cce56 [root@localhost ~]# docker restart ba353b8cce56 ba353b8cce56
4、登录mysql容器,查看编码
#进入容器 [root@localhost ~]# docker exec -it ba353b8cce56 /bin/sh sh-4.2# mysql -u root -p Enter password: #查看编码 mysql> show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name ? ? ? ? ? | Value ? ? ? ? ? ? ? ? ? ? | +--------------------------+----------------------------+ | character_set_client ? ? | utf8 ? ? ? ? ? ? ? ? ? ? ? | | character_set_connection | utf8 ? ? ? ? ? ? ? ? ? ? ? | | character_set_database ? | utf8 ? ? ? ? ? ? ? ? ? ? ? | | character_set_filesystem | binary ? ? ? ? ? ? ? ? ? ? | | character_set_results ? | utf8 ? ? ? ? ? ? ? ? ? ? ? | | character_set_server ? ? | utf8 ? ? ? ? ? ? ? ? ? ? ? | | character_set_system ? ? | utf8 ? ? ? ? ? ? ? ? ? ? ? | | character_sets_dir ? ? ? | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec)
修改编码成功。
5、查询数据
mysql> select * from user; +----+--------+ | id | name ? | +----+--------+ | ?1 | 中文 ? | +----+--------+ 1 row in set (0.01 sec)
如上图所示,查询数据中文不再乱码。
注意:
需要注意的是,在终端使用命令行插入数据时仍然无法输入中文,如下图所示:
mysql> insert into uesr(name) values("");
而上一篇文章我们讲到了重启mssql,参照文章里面的方法,经过测试在查询数据是不会有中文乱码出现,因为在创建容器的时候指定参数为LANG=C.UTF-8,它把数据库的编码也改为了utf8,不再出现乱码。所以,我建议还是在创建容器的时候加参数LANG=C.UTF-8来创建并启动容器。
(编辑:通辽站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|