8

MySQL导入数据库中文乱码问题解决

 2 years ago
source link: https://www.wyr.me/post/697
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
MySQL导入数据库中文乱码问题解决 - 轶哥
MySQL导入数据库中文乱码问题解决

温馨提示:如果需要迁移大量数据,一定要使用专业工具并请专业的公司提供技术支持,同时做好迁移审计工作。以下方案仅供参考。

MySQL导入数据库导致中文乱码属于常见问题。一般用客户端工具导入不容易出现此问题,但是有点大又不是特别大(10G-100G)的数据通过命令导入就比较容易遇到这个问题。而网上的答案几乎都是经验性的结论,答主大多知其然不知其所以然。

注:命令导入,即source xxx.sql

# 查看当前数据库状态
mysql> status
--------------
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id:        66
Current database:
Current user:        root@localhost
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        8.0.28 MySQL Community Server - GPL
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:        /var/run/mysqld/mysqld.sock
Binary data as:        Hexadecimal
Uptime:            4 hours 15 min 9 sec

通过status可以查看当前数据库状态,其中有4行characterset相关内容(与SHOW VARIABLES LIKE 'character_set_%';得到的结果一致)。

这里标识了服务器端的字符集、数据库字符集,还有客户端的字符集。

要避免乱码的关键就在于客户端和服务器端的字符集一致。

通过mysql -u root --default-character-set=utf8 -p连接到数据库命令行,再次尝试status命令。

mysql> status;
--------------
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id:        67
Current database:
Current user:        root@localhost
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        8.0.28 MySQL Community Server - GPL
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb3
Conn.  characterset:    utf8mb3
UNIX socket:        /var/run/mysqld/mysqld.sock
Binary data as:        Hexadecimal
Uptime:            4 hours 20 min 23 sec

此时Client charactersetConn. characterset均发生变化。

也就是说,如果遇到乱码,先检查客户端连接工具和服务器端编码是否一致,导出的SQL文件编码是否是utf8,修改一致后再次尝试source xxx.sql即可。


附一个简单的MySQL测试环境Docker命令:

docker run -v /home/ubuntu/mysql/:/var/lib/mysql -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root密码 --restart always --privileged=true --cap-add=sys_nice --name mysql-saas -itd mysql:8.0.28 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

(其中包含中文常见的编码设置方法,以及对容器放开CPU权限的设置)

导入较大的SQL文件常见Got a packet bigger than 'max_allowed_packet' bytes异常,解决方法:

SET GLOBAL max_allowed_packet=15242880000;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK