MySQL导入数据库中文乱码问题解决
- 首发:2022-02-23 20:55:58
- 教程
- 1781
温馨提示:如果需要迁移大量数据,一定要使用专业工具并请专业的公司提供技术支持,同时做好迁移审计工作。以下方案仅供参考。
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 characterset
与Conn. 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;
除特别注明外,本站所有文章均为原创。原创文章均已备案且受著作权保护,未经作者书面授权,请勿转载。
打赏
交流区
暂无内容




由于我使用的方案并不需要“快捷指令”等APP的配合。也无需任何系统权限。因此存在被滥用可能,请大家不要因为此事联系我,谢谢。
直接问AI吧😂
作者老哥,代码不开源。可以大致说一下实现思路吗😕
谢谢,你写的最详细,也很有效的解决了撕裂问题
很棒的教程,比我之前配置ap的方式更优雅