LastUpdate: 2019/06/05 23:45:37

戻る

キャラクタセット
20050105_〜_の文字化けの話
NLS_CHARACTERSET_設定内容の確認方法_1
20100227_DATE型から時分秒が取得できないとき
 


キャラクタセット

キャラクタセットとは、データファイル自体に文字を格納する時のコードセットである。

キャラクタセットの設定は、データベースの作成時に指定する必要がある。
例外は、現在使用されているキャラクタセットに対し、完全にスーパーセットの時は、変更できるらしが。

現在適用されているキャラクタセットを見る方法は


select * from NLS_DATABASE_PARAMETERS;
PARAMETER VALUE
NLS_CALENDAR GREGORIAN
NLS_CHARACTERSET AL32UTF8
NLS_COMP BINARY
NLS_CURRENCY $
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_DUAL_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_LANGUAGE AMERICAN
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_NCHAR_CONV_EXCP FALSE
NLS_NUMERIC_CHARACTERS .,
NLS_RDBMS_VERSION 9.2.0.1.0
NLS_SORT BINARY
NLS_TERRITORY AMERICA
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR

この設定値は、オラクルが稼働するOSやOSのキャラクタに依存しない。

キャラクタセット一覧

名前 説明 コメント
JA16SJIS シフトJIS 16 ビット日本語 MB、ASCII、UDC
JA16SJISTILDE 波形のダッシュとチルドがUnicode との間でマッピングされる方法を除き、JA16SJIS と同じ MB、ASCII、UDC
JA16SJISYEN シフトJIS 16 ビット日本語(バックスラッシュ(\)は日本語の円記号(¥)になります。) MB、UDC
AL16UTF16 Unicode 3.1 UTF-16 ユニバーサル・キャラクタ・セット MB、EURO、FIXED
AL32UTF8 Unicode 3.1 UTF-8 ユニバーサル・キャラクタ・セット MB、ASCII、EURO
UTF8 Unicode 3.0 UTF-8 ユニバーサル・キャラクタ・セット。CESU-8 準拠 MB、ASCII、EURO
JA16EUC EUC 24 ビット日本語 MB、ASCII
JA16EUCTILDE 波形のダッシュとチルドがUnicode との間でマッピングされる方法を除き、JA16EUC と同じ MB、ASCII
JA16EUCYEN 24 ビット日本語(バックスラッシュ(\)は日本語の円記号(¥)になります。) MB
JA16MACSJIS Mac クライアント・シフトJIS 16 ビット日本語 MB
     

コメントについて

SB シングルバイト・エンコーディング
MB マルチバイト・エンコーディング
FIXED 固定幅マルチバイト・エンコーディング
EURO ユーロ記号をサポート
UDC ユーザー定義文字をサポート
ASCII ASCII の完全なスーパーセット
参照
Oracle9i グローバリゼーション・サポート・ガイド リリース2(9.2) J06278-01.pdf
付録A「ロケール・データ」

NLS_LANG

オラクルに対するクライアントのキャラクタセットを設定するものである。

クライアントOSの扱えるキャラクタセットに合わす必要がある。
オラクルインスタンスのキャラクタセットと異なる場合は、OracleNETが変換してくれる。

書式

NLS_LANG = language_territory.charset

設定例

Windowsクライアント

NLS_LANG = JAPANESE_JAPAN.JA16SJISTILDE

UNIX系

NLS_LANG = JAPANESE_JAPAN.JA16EUC

設定の仕方

Windows系

環境変数から設定するのが一般的

UNIX系の場合
% setenv NLS_LANG FRENCH_FRANCE.WE8DEC
だそうです

設定方法はいろんなやり方があり、優先順位が決められている。

表3-1 に、NLS パラメータの各種設定方法の優先順位を示します。 優先順位の低い設定は、優先順位の高い設定によってオーバーライドされます。 たとえば、デフォルト値の優先順位が最も低く、他のすべての方法でオーバーライドされます。 また、SQL 関数内でNLS パラメータを設定すると、他のすべての設定方法がオーバーライドされます。

  1. (最も高い優先順位) SQL 関数での明示的な設定
  2. ALTER SESSION 文による設定
  3. 環境変数としての設定
  4. 初期化パラメータ・ファイル内での指定
  5. デフォルト

NLS_LANG とキャラクタセットの関係

SQL*Plusは、オラクルインスタンスからみれば、同一マシン上にあっても、クライアントアプリケーションである。

NLS_LANGはクラアントアプリケーションに対するキャラクタの指定であるが、OSに準拠したキャラクタである必要がある。

オラクルインスタンスのキャラクタセットとNLS_LANGが等しい場合は、コード変換は行われない。

コード変換される場合、文字の欠落は考慮する必要がある。

英字圏のオラクルインスタンスに、日本語のNLS_LANGの組み合わせは、? に置き換えれてしまう。

また、EUCに対し、ShiftJISの外字も変換してくれなかった


オラクルインスタンスにアクセスしてくるキャラクタセットが多様な場合は、それらをすべて包含できるキャラクタセットが望ましい。そのためにはAL32UTF8などのUTF系のキャラクタセットが望ましい。


20050105 〜 の文字化けの話

これは、Oracle9.0.1.4.0以上、Oracle9.2以上とWindowsとで、SJISとUnicode間の変換を行う時の、Unicodeの対応が異なる為に発生します。Windows上のUnicodeに対応するように、Oracleには”JA16SJISTILDE”、”JA16EUCTILDE”があります。
oo4o(Oracle Objects for OLE)の場合、INSERTの場合は問題が発生しませんが、SELECTなどの時には問題が発生します。

クライアント側ではレジストリキー名 HKEY_LOCAL_MACHIN\SOFTWARE\ORACLE\HOMEx、値の名前 NLS_LANG の値を”JAPANESE_JAPAN.JA16SJISTILDE”などにすると解消されます。

その他のミドルウエアでは、クライアントを修正すると共に、データベースのCHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”にする必要があります。

データベース作成後にCHARACTER SETを変更するには、変換後のキャラクタ・セットがスーパーセットでなくてはなりませんが、CHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”はスーパーセットではないため、データベースの作成し直しが発生します。スーパーセットについてはマニュアルを参照してください。

結果として、Windows環境の場合、CHARACTER SETを”JA16SJISTILDE”、NLS_LANGはサーバもクライアントも”JAPANESE_JAPAN.JA16SJISTILDE”にしないと文字化けは防げないようです。

また、データベースのキャラクタ・セットとクライアントのキャラクタ・セットが同一の場合、文字コード変換は行われません。

CHARACTER SETの移行方法

CHARACTER SETがJA16SJIS環境にてExportする。
CHARACTER SETがJA16SJISTILDEのデータベースを作成する。
1.で作成したExportファイルをNLS_LANGをJA16SJISとしてImportする。
Import完了後、NLS_LANGをJA16SJISTILDEとする。
NLS_LANGはWindowsの環境変数でも設定可能。
 コマンドプロンプトから
  set NLS_LANG=JAPANESE_JAPAN.JA16SJISTILDE
 と入力する。

CHARACTER SET
Oracle内部に格納する時に使用される文字コード体系。WindowsではJA16SJISかJA16SJISTILDEとなる。(OSに合わせる)

NLS_LANG
データベースから取り出した文字データをどのような文字コードで変換するかを設定する。

データベースのキャラクタ・セットを確認するには、
ディクショナリ・ビューNLS_DATABASE_PARAMETERSを確認する。
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
動的パフォーマンス・ビューV$NLS_PARAMETERSを確認する。

20050107-2 キャラクタセットの選択指針

http://www.venus.dti.ne.jp/~yoshi-o/RDB/Oracle-Beans_dictionary.html

ORACLEデータ取得時の文字化け
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200311_03110167.html

NLS_CHARACTERSET 設定内容の確認方法


サーバー/クライアントのNLS_LANG をJA16SJISTILDE にしなくてはならないようだ。

Windowsの場合、
環境変数 NLS_LANG に、 JAPANESE_JAPAN.JA16SJISTILDE  を設定する事。

これで、oo4oを経由して取得する時もバケなくなくなった 2005/01/11

http://ash.or.jp/db/ora_nls.htm


20100227 DATE型から時分秒が取得できないとき

オラクルからJDBC経由で、getObject を行うと型を意識せずにデータが取得できるが、うまくいかない時があった。

オラクルのDATE型は、時分秒〜ミリ秒まで保持している。getObjectで取得すると、java.sql.Date型で取れるケースと java.sql.TimeStamp型でとれるケースがあった。同一のオラクルインスタンスに対して、異なるクライアントからアクセスした場合であった。

時刻情報も含めて値を取得したいときに、java.sql.Date 型だと、時分秒が0リセットされた取得してしまう。

原因…不明

対策… getObject で 取得したクラスがjava.sql.Date で取得できた場合は、getTimeStamp を用いて、Timestampを取得するようにした。そうすれば、時分秒を含めて取得する事ができる。


戻る