MySQL 中文亂碼核心成因只有三類:服務端默認字符集非 UTF-8、表/庫字符集定義不一致、客戶端連接字符集未正確設置。本文提供 Windows 解壓版、Linux 包管理安裝、應用層連接三個維度的完整配置方案,強烈建議全鏈路統一使用 utf8mb4(支援完整 Unicode 包含 Emoji)。
my-default.ini 為 my.inimy.ini,在 [mysqld] 區塊添加:character_set_server = utf8mb4 collation_server = utf8mb4_general_ci
[client] port = 3306 default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4
SHOW VARIABLES LIKE 'char%'; 所有相關變量應顯示 utf8mb4編輯 /etc/my.cnf 或 /etc/mysql/my.cnf:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci init_connect = 'SET NAMES utf8mb4' # skip-character-set-client-handshake # 可選:強制忽略客戶端字符集請求
重啟服務:systemctl restart mysqld 或 /etc/init.d/mysqld restart
-- 創建數據庫 CREATE DATABASE `my_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 創建表 CREATE TABLE `users` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- 修改現有庫/表 ALTER DATABASE `old_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE `old_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull$pdo->exec("SET NAMES utf8mb4"); 或 DSN 中指定 charset=utf8mb4charset='utf8mb4' 參數SET NAMES utf8mb4| 數據文件編碼 | 會話設置 | 目標庫/表編碼 |
|---|---|---|
| UTF-8 | SET NAMES utf8mb4 | utf8mb4 |
| GBK/GB2312 | SET NAMES gbk | gbk |
⚠️ 嚴禁跨編碼導入:UTF-8 文件不能用 GBK 會話導入,反之亦然。Windows 下 iconv -f GBK -t UTF-8 file.csv -o file_utf8.csv 可轉換編碼。
<meta charset="utf-8">Content-Type: text/html; charset=utf-8-- 查看實例級字符集 SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation_%'; -- 查看庫/表定義 SHOW CREATE DATABASE db_name; SHOW CREATE TABLE table_name; -- 查看當前會話字符集 SHOW VARIABLES LIKE 'character_set_connection';