MySQL 涉及 **4 層字符集** 流向:
**亂碼本質:任一層不匹配 → 編碼錯誤轉換 → 資料損壞/顯示異常。**
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
關鍵觀察:`client`、`connection`、`results`、`database`、`server` 是否一致 (建議全 `utf8mb4`)。
-- 資料庫級
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 CHANGE col_name col_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注意: `CONVERT TO` 會重寫資料 (轉碼),大表耗時長、鎖表,維護窗口操作。
-- 單一連線立即生效 (最常用)
SET NAMES utf8mb4;
-- 等同於:
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
-- 僅影響當前 Session,斷線失效。
# my.cnf / my.ini [mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# [client] 區段 (影響 mysql 命令列等客戶端)
[client]
default-character-set = utf8mb4
# [mysql] 區段
[mysql]
default-character-set = utf8mb4
ERROR 1366 (HY000): Incorrect string value: '\xD5\xD4' for column 'name' at row 1
**原因**:Client 送 GBK 編碼字串 (`\xD5\xD4` = '中' GBK),但連線層 `character_set_client` 為 `utf8`,Server 嘗試以 UTF-8 解碼失敗。
**即時修正**:`SET NAMES gbk;` (告訴 Server 我送 GBK) → 插入成功。
**根治**:應用層連線字串指定 `charset=utf8mb4`,資料庫儲存統一 `utf8mb4`。
| 環境 | 配置範例 |
|---|---|
| JDBC (MySQL Connector/J 8.0+) | `jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL` |
| PHP (PDO) | `$pdo = new PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass);` |
| PHP (mysqli) | `mysqli_set_charset($link, 'utf8mb4');` |
| Python (PyMySQL / mysqlclient) | `charset='utf8mb4'` in connect() |
| Go (go-sql-driver/mysql) | `user:pass@tcp(host:3306)/db?charset=utf8mb4&parseTime=True&loc=Local` |
| Node.js (mysql2) | `charset: 'utf8mb4'` in createConnection() |
| Django (DATABASES) | `'OPTIONS': {'charset': 'utf8mb4'}` |
| Spring Boot (application.yml) | `url: jdbc:mysql://...?characterEncoding=utf8mb4&useSSL=false` + `hikari.connectionInitSql: SET NAMES utf8mb4` |