当前位置:首页 > 数据库 > 正文

MySQL中文乱码如何解决?

MySQL中文乱码解决方案核心是统一编码:确保数据库、表、连接均使用 utf8mb4字符集,需检查并修改服务器配置(my.cnf)、建库/表语句的字符集设置,并在连接字符串中明确指定 charset=utf8mb4

定位乱码根源

  1. 检查当前字符集配置
    在MySQL客户端执行:

    SHOW VARIABLES LIKE 'character_set_%';
    SHOW VARIABLES LIKE 'collation_%';

    关键变量需统一为utf8mb4

    • character_set_client
    • character_set_connection
    • character_set_database
    • character_set_results
    • character_set_server
  2. 确认表字段编码

    SHOW CREATE TABLE 表名;  -- 观察字段的`CHARSET`值

永久解决方案(修改配置)

步骤1:修改MySQL配置文件

MySQL中文乱码如何解决?  第1张

  • 找到配置文件 my.cnf(Linux)或 my.ini(Windows),在[mysqld][client][mysql]区块添加:

    [mysqld]
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    [client]
    default-character-set = utf8mb4
    [mysql]
    default-character-set = utf8mb4
  • 重启MySQL服务:

    systemctl restart mysql  # Linux
    # 或通过服务管理器重启Windows服务

步骤2:创建数据库时显式指定编码

CREATE DATABASE 数据库名 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;

步骤3:连接数据库时指定编码(关键!)
在应用代码中设置连接参数:

  • PHP示例(PDO):
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
  • Java(JDBC):
    jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8mb4

修复已存在乱码数据

警告:操作前务必备份数据!

  1. 转换数据库编码

    ALTER DATABASE 数据库名 
      CHARACTER SET utf8mb4 
      COLLATE utf8mb4_unicode_ci;
  2. 转换表编码

    ALTER TABLE 表名 
      CONVERT TO CHARACTER SET utf8mb4 
      COLLATE utf8mb4_unicode_ci;
  3. 修复已损坏数据(若乱码已产生)

    • 导出数据为SQL文件(用mysqldump
    • 用文本编辑器将文件编码转为 UTF-8 with BOM
    • 删除原表数据后重新导入

进阶排查技巧

  • 乱码类型分析
    • 全部显示为:写入时编码错误
    • 出现等乱码:读取时编码不一致
  • 终端环境检查
    • Linux系统:执行 locale 确认LANG=UTF-8
    • Windows CMD:使用 chcp 65001 切换UTF-8代码页

预防措施

  1. 统一编码规范
    • 始终使用 utf8mb4(支持4字节字符,兼容Emoji)
    • 避免使用已过时的utf8(MySQL中仅支持3字节)
  2. 验证数据写入流程
    • 确保应用层、数据库连接、表字段三处编码一致
    • 网页文件(HTML/PHP)添加 <meta charset="UTF-8">

常见误区

  • 仅修改数据库配置不调整连接参数
  • 混合使用utf8utf8mb4
  • 未重启MySQL使配置生效

引用说明:本文解决方案参考MySQL官方文档Character Set Configuration及万维网联盟(W3C)多语言支持标准,数据转换操作建议在专业运维人员指导下进行。

0