DB2 中文亂碼核心成因在於三個層級的代碼頁設定不一致。本文系統梳理系統級、實例級、資料庫級三層代碼頁關係,提供從建庫到運行期的完整修正方案。
| 層級 | 名稱 | 設定方式 | 可否修改 | 影響範圍 |
|---|---|---|---|---|
| 1. 系統級 | OS Locale | OS 區域/語言設定 | ✅ 可修改 | 應用程式預設代碼頁 |
| 2. 實例級 | DB2CODEPAGE | db2set DB2CODEPAGE=xxx | ✅ 可修改 | DB2 應用程式代碼頁判定與轉換 |
| 3. 資料庫級 | DATABASE CODEPAGE | CREATE DATABASE ... CODESET | ❌ 建庫後不可改 | 資料實際儲存編碼 |
直接建立中文相容資料庫:
-- 方式一:使用代碼頁數值 (1386=GBK, 86=中國區域)
db2 create db mydb using codeset 1386 territory 86
-- 方式二:使用標準名稱 (推薦)
db2 "CREATE DATABASE mydb USING CODESET UTF-8 TERRITORY CN"
-- 或
db2 "CREATE DATABASE mydb USING CODESET 1208 TERRITORY CN"
推薦 UTF-8 (1208):支援完整 Unicode,避免 GBK 字元集不足問題。
db2 get db cfg for mydb | findstr /i codeset
# 或
db2 "SELECT CODESET FROM SYSCAT.DATABASES WHERE DB_NAME = 'MYDB'"
db2set -all | findstr DB2CODEPAGE
# 未設定則繼承 OS Locale
locale 或 echo $LANG原則:應用程式編碼 (DB2CODEPAGE) → 資料庫編碼 (CODESET) 需一致或可正確轉換。
DB2CODEPAGE=1208 (UTF-8 用戶端) 或 1386 (GBK 用戶端,驅動自動轉換)DB2CODEPAGE=1386# Linux/Unix 設為中文
export LANG=zh_CN.UTF-8
# 或永久修改 /etc/locale.conf
# Windows
# 控制台 → 區域 → 系統管理 → 更改系統區域設定 → 中文(簡體/繁體)
# 當前會話臨時生效
db2set DB2CODEPAGE=1386
# 實例級永久生效 (需重啟實例 db2stop/db2start)
db2set DB2CODEPAGE=1386 -i db2inst1
# 全域生效 (所有實例)
db2set DB2CODEPAGE=1386 -g
# 查看當前生效值
db2set -lr
| 代碼頁 | 名稱 | 說明 |
|---|---|---|
| 1208 | UTF-8 | Unicode 標準,推薦新建資料庫使用 |
| 1386 | GBK / CP936 | 簡體中文擴展,Windows 中文預設 |
| 1388 | Big5 / CP950 | 繁體中文 |
| 819 | ISO-8859-1 | 西歐語系,不支援中文 |
| 943 | CP943 | 日文 Shift-JIS 擴展 |
db2stop force && db2startdb2 connect to mydb user xxx using xxxdb2 "INSERT INTO t1 VALUES ('測試中文')"db2 "SELECT * FROM t1" 觀察命令列顯示db2 "SELECT HEX(col1) FROM t1" 確認儲存編碼DB2CODEPAGE 後必須重啟實例才生效