首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 中文亂碼徹底解決:my.cnf、數據庫、表、連接四層字符集統一實戰

     編輯:MySQL 綜合教學

亂碼根因

MySQL 字符集鏈路:**Client → Connection → Server → Database → Table → Column**。任意一環不一致 (如 Client UTF8、Table Latin1) 即產生亂碼 ( / ? / 亂碼字符)。

四層統一配置法 (以 UTF8MB4 為例)

1. 服務端配置 (my.cnf / my.ini)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-character-set-client-handshake  # 強制忽略客戶端聲明,統一用 server 設置

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

重啟生效:systemctl restart mysqld

2. 數據庫級別

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 或修改現有庫
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

3. 表級別

CREATE TABLE t (c VARCHAR(100)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 轉換現有數據

4. 連接層 (應用代碼/JDBC/驅動)

  • JDBC URL: jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=UTC
  • Python/MySQLdb: charset='utf8mb4'
  • PHP PDO: charset=utf8mb4 in DSN
  • 命令行客戶端: mysql --default-character-set=utf8mb4

驗證字符集一致性

SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+

前 5 項必須均為 utf8mb4。

常見遷移場景:Latin1 → UTF8MB4

  1. 備份:mysqldump --default-character-set=latin1 --skip-set-charset db > backup.sql
  2. 2. 修改備份文件:將 CHARSET=latin1 替換為 CHARSET=utf8mb4,COLLATE=latin1_swedish_ci → utf8mb4_general_ci。 3. 構建新庫 (UTF8MB4) 導入:mysql --default-character-set=utf8mb4 db < backup.sql 4. 驗證數據完整性。

utf8 vs utf8mb4

  • utf8 (MySQL 別名 utf8mb3):最多 3 字節,**不支援 Emoji、生僻漢字 (𠮷、𡃁 等)**。
  • utf8mb4:真正 UTF-8,最多 4 字節,**全 Unicode 支援**,**生產環境強制使用**。
  • 5.5.3+ 版本完整支援 utf8mb4,索引長度限制 767 字節 → 5.6.3+ innodb_large_prefix=ON 可擴至 3072 字節。

避坑清單

  • 修改 my.cnf 後**必須重啟**服務。
  • ALTER TABLE ... CONVERT TO 會重建表並轉換數據,**大表謹慎操作** (用 pt-online-schema-change)。
  • JDBC URL 必須顯式指定 characterEncoding=utf8mb4,否則驅動默認可能用 utf8 或 latin1。
  • Navicat / Workbench 等 GUI 工具連接屬性中也要設置字符集為 UTF8MB4。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved