轶哥

妄图改变世界的全栈程序员。

MySQL导入数据库中文乱码问题解决
  •   更新:2022-02-23 20:55:58
  •   首发:2022-02-23 20:55:58
  •   教程
  •   872

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

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;
打赏
交流区

暂无内容

尚未登陆
发布
  上一篇 (CentOS 8 升级 RHEL 8)
下一篇 (MySQL批量重命名表名和列名)  

评论回复提醒