轶哥

📚 Having fun with AI Agent. Always learning.

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

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

    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批量重命名表名和列名)  

    评论回复提醒