MySQL 涉及四層字元集:
任一層不一致即產生亂碼。核心原則:**全鏈路統一為 utf8mb4**。
/etc/my.cnf[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci init_connect = 'SET NAMES utf8mb4' skip-character-set-client-handshake # 強制忽略客戶端請求的字元集 [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4
CREATE DATABASE `mydb` DEFAULT 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;
| 語言/驅動 | 設定方式 |
|---|---|
| PHP (mysqli) | $mysqli->set_charset('utf8mb4'); |
| PHP (PDO) | new PDO('mysql:host=...;charset=utf8mb4', ...) |
| Python (PyMySQL) | charset='utf8mb4' 參數 |
| Java (JDBC) | ?characterEncoding=utf8mb4 或 connectionInitSql=SET NAMES utf8mb4 |
| Go (go-sql-driver/mysql) | charset=utf8mb4,utf8 DSN 參數 |
| Node.js (mysql2) | charset: 'utf8mb4' 選項 |
<meta charset="utf-8">SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; -- 期望輸出: -- character_set_server: utf8mb4 -- character_set_database: utf8mb4 -- character_set_connection: utf8mb4 -- character_set_client: utf8mb4 -- character_set_results: utf8mb4 -- collation_server: utf8mb4_general_ci
utf8 vs utf8mb4utf8 實為 utf8mb3(最多 3 位元組),**不支援 Emoji、生僻字**。**必須用 utf8mb4**。ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4; 或導出 SQL 檔手工替換 CHARSET=latin1 → utf8mb4 後重導入。SET NAMES。MySQL 中文亂碼本質是**字元集不一致**。以 utf8mb4 為唯一標準,從 my.cnf、建表、連線驅動、檔案編碼、前端頁面**全鏈路統一**,並用 SHOW VARIABLES 驗證,即可徹底根治。