最近在專案開發中,MySQL 中文亂碼問題像個頑固的幽靈,纏著我不放。好不容易徹底搞定,趁熱打鐵整理出這份「完美解決方案」,既供同行參考,也方便日後自己回顧查閱。
一切從「知己知彼」開始。打開 MySQL 客戶端,執行以下兩條指令,檢查資料庫與伺服器端的字符集配置:
SHOW VARIABLES LIKE '%colla%'; SHOW VARIABLES LIKE '%char%';
若結果顯示均為 gbk2312 或 gbk,代表僅支援簡體中文,繁體字與特殊符號將無法正常寫入。此時必須將字符集統一修改為 UTF-8(MySQL 中寫作 utf8 或 utf8mb4)。
my.ini (Windows) / my.cnf (Linux)my.ini(Linux 通常在 /etc/my.cnf)。default-character-set,將後方數值改為 utf8。注意:客戶端與伺服器端兩處都要改。SHOW VARIABLES 指令驗證,應看到所有相關變數均為 utf8 或 utf8_general_ci。
my.ini 不會追溯既往修改配置文件只影響新建的資料庫與資料表。舊有物件需手動轉換:
SHOW CREATE DATABASE `db_name`; / SHOW CREATE TABLE `tbl_name`;ALTER DATABASE `db_name` CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE `tbl_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;(CONVERT TO 會一併轉換欄位資料)修改為 UTF-8 後,在 MySQL 命令列下插入或查詢中文常顯示亂碼,但輸出到網頁或應用程式卻正常。這是因為 Windows 預設代碼頁不支援 UTF-8 顯示。
應對技巧:在命令列操作前先執行 SET NAMES gbk; 即可暫時用 GBK 寫入簡體中文(但無法寫入繁體/特殊符號);正式環境請務必在應用程式連線時設定 SET NAMES utf8 或連線參數 characterEncoding=utf-8。
-- 建庫 CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; -- 建表 CREATE TABLE `database_user` ( `ID` VARCHAR(40) NOT NULL DEFAULT '', `UserID` VARCHAR(40) NOT NULL DEFAULT '' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建庫、建表、連線三端編碼一致,基本杜絕亂碼根源。
| 資料檔編碼 | 連線設定 | 資料庫/資料表編碼 | 匯入指令範例 |
|---|---|---|---|
| UTF-8 | SET NAMES utf8; | UTF-8 | LOAD DATA LOCAL INFILE 'C:\\utf8.txt' INTO TABLE yjdb; |
| ANSI (GBK/GB2312) | SET NAMES gbk; | GBK | LOAD DATA LOCAL INFILE 'C:\\gbk.txt' INTO TABLE yjdb; |
切記:UTF-8 檔不可導入 GBK 庫,反之亦然;DOS 視窗不支援 UTF-8 顯示,僅影響觀感,不影響資料正確性。
<meta charset="utf-8">(HTML5)或 header("Content-Type: text/html; charset=utf-8");(PHP)。?useUnicode=true&characterEncoding=utf-8。SET NAMES utf8(或 utf8mb4)。若專案已長期運行且無法改動既有 GBK 資料,可將頁面編碼設為 GBK(支援較多漢字),但強烈建議新專案直接上 UTF-8/utf8mb4,一勞永逸支援全球字符。
遵循這套流程,MySQL 中文亂碼將不再是開發路上的絆腳石。