MySQL 中文亂碼成因集中在三點:服務器默認字符集非 UTF-8、表/庫字符集不一致、客戶端連接未指定字符集。本文給出「配置文件落地 + 應用層顯式指定」的徹底根治方案,含 Debian/Ubuntu 實測配置模板。
latin1(MySQL 5.7 前默認)SET NAMES utf8mb4 或連接參數缺失 charset核心原則: 全鏈路統一 **utf8mb4**(支持 Emoji、生僻字),拒絕 utf8/gbk/latin1 混用。
mysql -uroot -p
mysql> ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
/etc/mysql/my.cnf(MySQL 5.5+ / 8.0 通用)[client]
default-character-set = utf8mb4
[mysqld]
default-storage-engine = InnoDB
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci # 8.0 推薦 utf8mb4_0900_ai_ci
# 可選:強制客戶端字符集(super 用戶不生效)
# init_connect = 'SET NAMES utf8mb4'
systemctl restart mysql
mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set_%';"
預期輸出:character_set_server、character_set_database、character_set_client、character_set_connection、character_set_results 均為 utf8mb4。
-- 創建庫
CREATE DATABASE `biz_db`
CHARACTER SET 'utf8mb4'
COLLATE 'utf8mb4_general_ci';
-- 創建表
CREATE TABLE `user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) 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;
-- 僅修改表默認字符集(不轉換現有數據)
ALTER TABLE `old_table` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
| 場景 | 設置 | 命令示例 |
|---|---|---|
| 數據文件為 UTF-8 | SET NAMES utf8mb4; + 庫表同 utf8mb4 | LOAD DATA LOCAL INFILE 'utf8.txt' INTO TABLE t; |
| 數據文件為 GBK | SET NAMES gbk; + 庫表同 gbk | LOAD DATA LOCAL INFILE 'gbk.txt' INTO TABLE t; |
⚠️ **嚴禁** UTF-8 文件導入 GBK 表,或 GBK 文件導入 UTF-8 表,必會亂碼。
charset=utf8mb4SET NAMES utf8mb4(連接池場景需在 init_sql 配置)<meta charset="utf-8">(HTML5 寫法)gbk,應用層 SET NAMES gbk#!/bin/bash
mysql -uroot -p -e "
SELECT @@character_set_server, @@collation_server;
SHOW VARIABLES LIKE 'character_set_%';
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
AND TABLE_COLLATION NOT LIKE 'utf8mb4%';"
輸出為空即全庫表字符集合規。
「配置文件標準化 + 應用層顯式指定 + 庫表創建規範」三位一體,是徹底根治 MySQL 中文亂碼的唯一正解。