如何配置mysql字符集_mysql中文乱码解决

2次阅读

mysql中文乱码本质是字符集不一致,需统一客户端、服务器、数据库、表、连接五环节为utf8mb4;通过SHOW VARIABLES确认配置,修改my.cnf永久设置,ALTER database/table升级旧对象,并在应用连接字符串中指定charset=utf8mb4。

如何配置mysql字符集_mysql中文乱码解决

MySQL 中文乱码本质是字符集不一致导致的,核心在于客户端、服务器、数据库、表、连接这五个环节的字符集要统一为 utf8mb4(不是旧版 utf8),否则任意一环掉链子,就可能显示问号、黑方块或 Mojibake(如“我爱你”)。

一、确认当前字符集配置

登录 MySQL 后执行:

mysql> SHOW VARIABLES LIKE ‘character%’;
mysql> SHOW VARIABLES LIKE ‘collation%’;

重点关注以下几项是否为 utf8mb4

  • character_set_server:服务器默认字符集(影响新建库)
  • collation_server:对应排序规则(推荐 utf8mb4_unicode_ciutf8mb4_0900_as_cs
  • character_set_client / character_set_connection / character_set_results:客户端通信三件套,应统一为 utf8mb4

二、永久修改 MySQL 配置文件(关键步骤)

编辑 MySQL 主配置文件(linux 通常是 /etc/my.cnf/etc/mysql/my.cnfwindowsmy.ini),在 [mysqld][client] 段落中添加或修正:

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = ON

[mysql]
default-character-set = utf8mb4

⚠️ 注意:
– 必须重启 MySQL 服务生效(sudo systemctl restart mysql
skip-character-set-client-handshake 可防止应用层错误设置覆盖服务端配置
– 不要用 init_connect='SET NAMES utf8mb4' 替代全局配置,它对 SUPER 权限用户无效

三、修复已有数据库和表的字符集

配置生效后,旧库/表不会自动转换,需手动升级:

  • 修改数据库默认字符集:
    ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  • 修改单个表(含字段):
    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 只改表结构不改数据(更安全):
    ALTER TABLE tbl_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

✅ 建议操作前备份;若字段原为 utf8 且含四字节 emoji,用 CONVERT TO 才能真正重编码。

四、应用连接层也要配对

即使 MySQL 端设好了,程序连接时仍可能出问题。常见场景:

  • PHP pdo:DSN 中加 ;charset=utf8mb4,例如:
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $u, $p);
  • Java JDBC:URL 加参数:
    jdbc:mysql://localhost:3306/test?characterEncoding=utf8mb4&serverTimezone=UTC
  • Python PyMySQL/MySQLdb:连接时指定:
    charset='utf8mb4'
  • 命令行客户端:启动时加 --default-character-set=utf8mb4,或在 [mysql] 段配置

? 小技巧:连接后立即执行 SET NAMES utf8mb4; 可临时校准会话层三字符集(但不如配置文件+连接参数可靠)。

text=ZqhQzanResources