Oracle Character Set変換(3): 3. Client環境の構成(2)

前の記事に続いて、Oracle Character Set変換クライアント環境の構成について説明します。 Oracle Server Character SetとClient NLS_LANGの推奨構成の4つを確認できます。

3.2。テストケース実行結果の整理

前の記事 Oracle Character Set変換(2): 3. Client環境の構成(1)の各テストケース実行結果を次のようにまとめた。

ケース#サーバー
Character Set
Client NLS_LANG入力出力DUMP 
1US7ASCIIKO16KSC5601'ハングル'成功壊れたTyp=1 Len=2 CharacterSet=US7ASCII: 3f,3f
'シャル'失敗--
2US7ASCIIKO16MSWIN949'ハングル'成功壊れたTyp=1 Len=2 CharacterSet=US7ASCII: 3f,3f
'シャル'成功壊れたTyp=1 Len=1 CharacterSet=US7ASCII: 3f
3US7ASCIIUS7ASCII'ハングル'成功ノーマルTyp=1 Len=4 CharacterSet=US7ASCII: c7,d1,b1,db
'シャル'成功ノーマルTyp=1 Len=2 CharacterSet=US7ASCII: 98,de
4KO16MSWIN949KO16KSC5601'ハングル'成功ノーマルTyp=1 Len=4 CharacterSet=KO16MSWIN949: c7,d1,b1,db
'シャル'失敗--
5KO16MSWIN949KO16MSWIN949'ハングル'成功ノーマルTyp=1 Len=4 CharacterSet=KO16MSWIN949: c7,d1,b1,db
'シャル'成功ノーマルTyp=1 Len=2 CharacterSet=KO16MSWIN949: 98,de
6KO16MSWIN949US7ASCII'ハングル'成功壊れたTyp=1 Len=4 CharacterSet=KO16MSWIN949: 3f,3f,3f,3f
'シャル'成功壊れたTyp=1 Len=2 CharacterSet=KO16MSWIN949: 3f,3f
7AL32UTF8KO16KSC5601'ハングル'成功ノーマルTyp=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
'シャル'失敗--
8AL32UTF8KO16MSWIN949'ハングル'成功ノーマルTyp=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
'シャル'成功ノーマルTyp=1 Len=3 CharacterSet=AL32UTF8: ec,83,be
9-1AL32UTF8AL32UTF8
(cmd)
'ハングル'失敗--
'シャル'失敗--
9-2AL32UTF8AL32UTF8
(PowerShell)
'ハングル'成功ノーマルTyp=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
'シャル'成功ノーマルTyp=1 Len=3 CharacterSet=AL32UTF8: ec,83,be

3.3 Oracle Server Character SetおよびClient NLS_LANGの推奨構成

ハングル入出力用のOracle ServerとClient環境構成は、次の4つの組み合わせが可能です。

ケース#サーバー
Character Set
Client
NLS_LANG
コメント
3US7ASCIIUS7ASCII絶対に使用しないでください。既存の環境を変更できない場合のみ使用!
5KO16MSWIN949KO16MSWIN949ハングル、英字、数字、特殊文字、漢字などハングルWindows上でサポートする文字のみ保存し、入出力する場合に使用(サーバーに多言語文字保存不可)
8AL32UTF8KO16MSWIN949サーバーは多言語環境であり、Clientではハングルのみを入出力する場合に使用。 Client application が Unicode を処理できない場合に使用可能
9AL32UTF8AL32UTF8サーバーに保存されている値を変換せずにクライアントにそのまま送信します。
つまり、クライアントはUTF8でエンコードされたデータを直接ハンドリングする必要があります。

Case #3は入出力に問題がないように見えるが、Dump値を見るとCharacter SetがUS7ASCIIになっていることがわかる。つまり、実際の入出力はUS7ASCIIの1 byte単位で実行するという意味であり、誤って保存されている状態である。

Case #3 실행결과
Case #3の実行結果

このデータを外部システムにEAI、ETL、ESBなどを介して転送すると、ハングル文字が壊れる現象が発生し、正確なデータ交換に多くの困難を経験することになる。したがって、Case #3は絶対に避けるべき設定です。

Case 9-1は、もともと問題なく入出力される設定や、Windowsコマンドプロンプトであるcmd.exeでUnicode入出力をサポートしていないために発生する現象である。
Windows PowerShellでCase 9-2を確認すると、正常に入出力されることが確認できる。

ハングル以外に中国文字、日本文字、タイ文字、西ヨーロッパ文字などの多言語文字を保存するためには、次の2つの組み合わせが可能である。

ケース#サーバー
Character Set
Client
NLS_LANG
コメント
8AL32UTF8各言語の文字に応じて設定Client NLS_LANG 設定
– ハングルの場合: KO16MSWIN949
– 中国文字: ZHS16GBK、またはZHT16MSWIN950、またはZHT16HKSCS
– 日本文字: JA16SJIS
- タイ文字:TH8TISASCIIなど
下の表を参照
9AL32UTF8AL32UTF8サーバーに保存されている値を変換せずにクライアントにそのまま送信します。
つまり、クライアントはUTF8でエンコードされたデータを直接ハンドリングする必要があります。

上記の<各言語文字に従って設定>するClient NLS_LANG値のリストは次のとおりです。

Operating System LocaleNLS_LANG Value
アラビック(UAE)ARABIC_UNITED ARAB EMIRATES.AR8MSWIN1256
BulgarianBULGARIAN_BULGARIA.CL8MSWIN1251
CatalanCATALAN_CATALONIA.WE8MSWIN1252
中国(PRC)SIMPLIFIED CHINESE_CHINA.ZHS16GBK
中国(台湾)TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
中国(香港HKCS)TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS
中国(香港HKCS2001)TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS2001 (new in 10gR1)
CroatianCROATIAN_CROATIA.EE8MSWIN1250
チェコCZECH_CZECH REPUBLIC.EE8MSWIN1250
DanishDANISH_DENMARK.WE8MSWIN1252
Dutch (Netherlands)DUTCH_THE NETHERLANDS.WE8MSWIN1252
ダッチ(ベルギー)DUTCH_BELGIUM.WE8MSWIN1252
English (United Kingdom)ENGLISH_UNITED KINGDOM.WE8MSWIN1252
English (United States)AMERICAN_AMERICA.WE8MSWIN1252
EstonianESTONIAN_ESTONIA.BLT8MSWIN1257
FinnishFINNISH_FINLAND.WE8MSWIN1252
French (Canada)CANADIAN FRENCH_CANADA.WE8MSWIN1252
フランス(フランス)FRENCH_FRANCE.WE8MSWIN1252
ドイツ(ドイツ)GERMAN_GERMANY.WE8MSWIN1252
GreekGREEK_GREECE.EL8MSWIN1253
HebrewHEBREW_ISRAEL.IW8MSWIN1255
HungarianHUNGARIAN_HUNGARY.EE8MSWIN1250
IcelandicICELANDIC_ICELAND.WE8MSWIN1252
インドネシアINDONESIAN_INDONESIA.WE8MSWIN1252
イタリアン(イタリア)ITALIAN_ITALY.WE8MSWIN1252
JapaneseJAPANESE_JAPAN.JA16SJIS
韓国KOREAN_KOREA.KO16MSWIN949
LatvianLATVIAN_LATVIA.BLT8MSWIN1257
LithuanianLITHUANIAN_LITHUANIA.BLT8MSWIN1257
NorwegianNORWEGIAN_NORWAY.WE8MSWIN1252
PolishPOLISH_POLAND.EE8MSWIN1250
Portuguese (Brazil)BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252
Portuguese (Portugal)PORTUGUESE_PORTUGAL.WE8MSWIN1252
RomanianROMANIAN_ROMANIA.EE8MSWIN1250
ロシアRUSSIAN_CIS.CL8MSWIN1251
SlovakSLOVAK_SLOVAKIA.EE8MSWIN1250
スペイン(スペイン)SPANISH_SPAIN.WE8MSWIN1252
SwedishSWEDISH_SWEDEN.WE8MSWIN1252
タイTHAI_THAILAND.TH8TISASCII
スペイン(メキシコ)MEXICAN SPANISH_MEXICO.WE8MSWIN1252
Spanish (Venezuela)LATIN AMERICAN SPANISH_VENEZUELA.WE8MSWIN1252
TurkishTURKISH_TURKEY.TR8MSWIN1254
ウクライナUKRAINIAN_UKRAINE.CL8MSWIN1251
VietnameseVIETNAMESE_VIETNAM.VN8MSWIN1258

*ソース: NLS_LANG FAQ(oracle.com) 文書の内容

ここで一つの疑問が生じることがある。

サーバーのCharacter SetはUnicode方式であるAL32UTF8で指定されたのですが、なぜClient NLS_LANGは2 byte方式であるKO16MSWIN949を指定するのか?

これは、Windowsオペレーティングシステムがハングルをエンコード/デコードする基本的な方法だからです。 (ちなみに、UNiX上でハングルを入出力する場合はKO16KSC5601を使用するのが一般的です。) もう一度言うと、Server Character Setは文字列データを「保存」するための設定であり、Client NLS_LANGは文字列データを「表示」してくれます。 、「転送」するための設定である。

Server Character Setは、複数の国の文字を「保存」するためにUnicode方式であるAL32UTF8を指定し、このサーバーに接続する様々な国のClient(主にWindows)環境では、各言語別Windowsでサポートする基本エンコーディング/デコーディング方式を指定するのだ。 Non-Unicodeとして入力されたデータは、OracleクライアントとSQL * Netを介してサーバーに渡され、Unicodeに変換されて保存されます。


Server Character SetがAL32UTF8のときにClient NLS_LANGを同じようにAL32UTF8に指定すると、サーバーに格納されているUnicode値が変換プロセスなしでClientに渡されます。つまり、クライアントNLS_LANGをAL32UTF8として指定するには、クライアントでUnicodeをエンコード/デコードできる必要があります。

参考として無料で提供されるツールのうち、ORACLE SQL Developerが代表的にUnicodeをうまくサポートするツールだ。 DBeaverもjdbcベースでUnicodeをうまくサポートしています。


これまでの内容が複雑でCharacter Setの選択が難しいと思えば、以下の内容だけを覚えておくとよい。

  • Server Character SetをAL32UTF8に設定
  • Client NLS_LANG
    • clientがUnicodeを処理できない場合、または特定の言語に限定されている場合は、その言語に対応する値の設定
    • clientがUnicodeを処理できる場合AL32UTF8

これまで、Oracle Character Set関連のClient環境構成について見てきました。

次の記事では、Server Character SetがUS7ASCIIであり、ハングルが格納されている間違った環境でCharacter Setを変換する方法について説明します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ja日本語