Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nakunaru/4560971 to your computer and use it in GitHub Desktop.
Save nakunaru/4560971 to your computer and use it in GitHub Desktop.
DB2におけるutf-8で作成されたDBへアクセスする際に文字化けが発生する現象の再現
1.DB作成
CREATE DATABASE utf8db USING CODESET utf-8 TERRITORY JP COLLATE USING IDENTITY
2.DBのcodepage確認
- linux
db2 get db cfg for utf8db | grep コードセット
- win
db2 get db cfg for utf8db | findstr コードセット
2.データ投入
db2 "create table testtab (a int, b varchar(15)) in userspace1"
db2 "insert into testtab values(1,'あいうえお')"
db2 "insert into testtab values(2,'中村 仁')"
db2 "insert into testtab values(3,'東郷平八郎')"
3.Windowsクライアントから接続
3-1. デフォルト設定の場合
db2set DB2CODEPAGE --> 設定なし
set DB2CODEPAGE --> 設定なし
CLP(SJISクライアント)から接続 --> 文字化けなし
db2 connect to utf8db
db2 "select * from testtab"
A B
----------- ---------------
1 あいうえお
2 中村 仁
3 東郷平八郎
3-2. プロファイル・レジストリ:db2set DB2CODEPAGE=1208
set DB2CODEPAGE --> 設定なし
CLP(SJISクライアント)から接続 --> 文字化あり
db2 connect to utf8db
db2 "select * from testtab"
A B
----------- ---------------
1 縺ゅ>縺・∴縺・
2 荳ュ譚代€€莉・
3 譚ア驛キ蟷ウ蜈ォ驛・
3-3. 環境変数:set DB2CODEPAGE=1208
db2set DB2CODEPAGE --> 設定なし
CLP(SJISクライアント)から接続 --> 文字化あり
db2 connect to utf8db
db2 "select * from testtab"
A B
----------- ---------------
1 縺ゅ>縺・∴縺・
2 荳ュ譚代€€莉・
3 譚ア驛キ蟷ウ蜈ォ驛・
4.Linuxクライアントから接続
4-1.
LANG=ja.JP.utf-8
DB2CODEPAGE=1208
CLP(utf-8クライアント)から接続 --> 文字化けなし
A B
----------- ---------------
1 あいうえお
2 中村 仁
3 東郷平八郎
4-2.
LANG=ja.JP.utf-8
DB2CODEPAGE=IBM-943
CLP(utf-8クライアント)から接続 --> 文字化けあり
A B
----------- ---------------
1
2
3
5.結論
1.DB2では、DBのコードセットとクライアントのCODEPAGEが異なる場合、自動でコードページの変換が行われる。
2.DB側のコードセットは、CREATE DB時に指定したもので、get db cfg にて確認できる
3.クライアント側のコードセットは、プロファイル・レジストリ、または環境変数によって判断される
・プロファイル・レジストリ --> db2set DB2CODEPAGE=IBM-943 または db2set DB2CODEPAGE=1208 でそれぞれSJISとutf-8
・環境変数 --> set DB2CODEPAGE=IBM-943 または set DB2CODEPAGE=1208
export DB2CODEPAGE=IBM-943 または export DB2CODEPAGE=1208
4.プロファイル・レジストリによって制定されたDB2CODEPAGEが影響を与える範囲については未検証。
インスタンス単位の設定のため、ミドルウェアによっては上手く認識されないケースがあるのではないかと予測している。
環境変数で指定された値であれば、そのユーザで実行されるアプリケーションで認識されるのではないかと思われる。
5.SJISで処理を行うクライアントでは、set DB2CODEPAGE=IBM-943 を指定し接続を行う。
これにより、CODEPAGEの自動変換が発生し、文字化けなしで処理が可能なはず。
utf-8で処理を行うクライアントでは、export DB2CODEPAGE=1208 を指定し接続を行う。
これにより、utf-8のままで処理が可能なはず。
補足
・JDBCからの接続は常にutf-8で処理される
・CLI/ODBCアプリケーションの場合は以下の設定によりCODEPAGEを指定できるようだ(未検証)
ftp://ftp.software.ibm.com/ps/products/db2/fixes/spanish/db2ntv7/FP6_WR21299/ReleaseNotes/doc/jp/db2ir/db2ir345.htm
-- CLI/ODBC アプリケーションの場合、 SQLSetConnectAttr() を呼び出して SQL_ATTR_ANSI_APP を SQL_AA_FALSE に設定します。デフォルト設定は SQL_AA_TRUE です。
http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.cli.doc%2Fdoc%2Fr0006816.html&resultof%3D%2522%2553%2551%254c%255f%2541%2554%2554%2552%255f%2541%254e%2553%2549%255f%2541%2550%2550%2522%2520%2522%2573%2571%256c%255f%2561%2574%2574%2572%255f%2561%256e%2573%2569%255f%2561%2570%2570%2522%2520
-- SQL_ATTR_ANSI_APP
-- アプリケーションを ANSI または Unicode アプリケーションとして識別する 32 ビットの符号なし整数。 この属性の値は次のうちの 1 つとなります。
--
-- SQL_AA_TRUE (デフォルト) : アプリケーションは ANSI アプリケーションです。 すべての文字データは、 ANSI バージョンの CLI/ODBC 関数を使用して、 ネイティブ・アプリケーション (クライアント) のコード・ページでアプリケーションとやり取りされます。
-- SQL_AA_FALSE: アプリケーションは Unicode アプリケーションです。 Unicode (W) バージョンの CLI/ODBC 関数が呼び出されると、 すべての文字データは Unicode でアプリケーションとやり取りされます。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment