字元集設定錯誤是資料庫中文亂碼的首因。本文以 MySQL 與 DB2 為例,解析三層編碼鏈路:資料庫/表層級設定 → 用戶端/命令列編碼 → SQL 腳本檔案編碼,三者必須一致才能正確存取中文。
-- 建庫指定預設字元集
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 建表指定(可覆蓋資料庫預設)
CREATE TABLE t1 (
id VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
建議:使用 utf8mb4(支援完整 Unicode 包含 Emoji),而非舊版 utf8(僅支援 BMP 平面)。
-- 建庫指定 CODESET 與 TERRITORY
CREATE DATABASE mydb USING CODESET UTF-8 TERRITORY CN;
-- 或使用數值代碼頁
CREATE DATABASE mydb USING CODESET 1208 TERRITORY CN;
CODESET UTF-8 / 1208:Unicode UTF-8 編碼TERRITORY CN:中國地區設定(影響日期/貨幣/排序規則)資料庫儲存為 UTF-8,但命令列視窗預設編碼通常為 GBK (CP936/1386)。若不調整,輸入中文會被誤解碼。
SET NAMES gbk;(僅當前連線)my.ini [client] default-character-set=gbkdb2set DB2CODEPAGE=1386(1386 = GBK/CP936)db2set DB2CODEPAGE=1386 -g(全域/實例級)原理:設定後,用戶端以 GBK 輸入 → DB2 自動轉為 UTF-8 存入 → 查詢時 UTF-8 轉 GBK 顯示,實現「所見即所得」。
執行 source file.sql (MySQL) 或 db2 -tf file.sql (DB2) 時:
| 誤區 | 後果 | 正確做法 |
|---|---|---|
| 以為資料庫設 UTF-8 就不用管命令列 | 中文輸入亂碼、查詢顯示亂碼 | 命令列必須設 GBK (1386) |
| SQL 檔存為 UTF-8 執行 | 中文無法識別、入庫錯誤 | SQL 檔存為 ANSI/GBK |
| DB2 資料庫建完想改 CODESET | 不可修改,需重建庫 | 建庫前規劃好 CODESET |
| 混用 UTF-8 命令列與 GBK SQL 檔 | 編碼不匹配導致資料損壞 | 三層編碼:資料庫 UTF-8、命令列 GBK、SQL檔 GBK |
db2cli.ini 設定 CodePage=1386