web-dev-qa-db-ja.com

Windows上のDB2:db2cmdおよびJDBCのエンコーディングを修正

Windows Server 2013でDB2 v10.5 FP 7を実行していますが、エンコード設定に問題があります。

ウィンドウは、地域設定および入力言語としてドイツ語(スイス)を使用するように設定されています。

_chcp: Active code page: 850
_

私のデータベースはUTF-8に設定されています。db2get cfgからのこの出力を参照してください

_ Datenbankgebiet = CH
 Codepage für Datenbank = 1208
 Codierter Zeichensatz der Datenbank = UTF-8
 Landescode der Datenbank = 41
 Sortierfolge der Datenbank = SYSTEM_1252
 Alternative Sortierfolge (ALT_COLLATE)  = 
_

ウムラウト付きのUTF-8文字列はデータベースに正しく格納されます(有効な16進数値を確認することで確認されます)。ただし、取得時には、それらは混同されます: db2 CLI output

正しい値は「87100-ÜberbauungHinterroos」です。また、デフォルトのdb2出力が「Sätze」ではなく「Sõtze」として表示されていることに注意してください。

JDBC/Javaを介して同じ行を選択することにより、誤った出力を再現することもできます。

IBM Documentation この動作は、サーバーで明示的に設定されていないDB2CODEPAGEレジストリー変数にリンクされていると述べています。

これを修正する方法はありますか?

EDIT:(@maoからのリクエストに応じて詳細情報):

Windowsのデフォルトコードページも850です。レジストリのコードページは次のとおりです。

  • ACP 1252
  • OEMCP 850
  • MACCP 10000

私が間違ったリードをフォローしていないことを確認するために、出力されたSELECT HEX(DISPLAY_NAME)...によってテーブルに保存された文字列を検証しました

_3837313030202D20C39C626572626175756E672048696E746572726F6F73
_

ウムラウト付きの文字は0xC39Cで、これは 大文字のUとダイアレシス です。

DB2CODEPAGE変数を1208に設定すると、出力が別の間違った出力に変更されます。 CLI output 2

2
tannerli

IBMとのサポートケースを開いた後、彼らは私に解決策につながる手がかりを与えました:

->まず、コマンドウィンドウのタイトルバーを右クリックして、[プロパティ]をクリックします。

文字の表示にTrueTypeフォントを使用していますか?

結局のところ、font(wtf?)を変更すると、上記の文字の表示が変更されます。

これは、DB2 CLIウィンドウの特定の動作です。TrueType以外のフォントで通常のコマンドを開くと、期待どおりに機能します。

2
tannerli

コードページ850は、固定幅のレガシー8ビット文字セットです。多くの場合、コードページ1252がコードページ850に取って代わりました。

次のように850ではなくコードページ1252を試すと、Db2-CLPに違いが生じますか?

db2 connect reset
db2 terminate
chcp 1252
db2 connect to ....
db2 "select ..."

Windowsの「システムデフォルト」コードページは、コードページ850と同じですか。 Windowsの地域設定やレジストリでこれを再確認してください。 Java/jdbcもシステムのデフォルト設定の影響を受けます。

Windows環境変数DB2CODEPAGEを1208に明示的に設定すると役立つ場合がありますが、予期しない結果になる可能性があるため、慎重なテストが必要です。

0
mao