Created
January 17, 2013 23:45
-
-
Save nakunaru/4560971 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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