加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Docker的mysql中文乱码问题

发布时间:2023-01-05 09:32:44 所属栏目:MsSql教程 来源:未知
导读: 在之前的文章里面介绍了,而在先使用nactive数据库管理软件添加数据,而通过终端命令行查询数据时发现中文乱码了。如下图所示:
mysql> use test;Reading table information for completio

在之前的文章里面介绍了,而在先使用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来创建并启动容器。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!