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 の完全なスーパーセット |
オラクルに対するクライアントのキャラクタセットを設定するものである。
クライアント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 パラメータを設定すると、他のすべての設定方法がオーバーライドされます。
- (最も高い優先順位) SQL 関数での明示的な設定
- ALTER SESSION 文による設定
- 環境変数としての設定
- 初期化パラメータ・ファイル内での指定
- デフォルト
SQL*Plusは、オラクルインスタンスからみれば、同一マシン上にあっても、クライアントアプリケーションである。
NLS_LANGはクラアントアプリケーションに対するキャラクタの指定であるが、OSに準拠したキャラクタである必要がある。
オラクルインスタンスのキャラクタセットとNLS_LANGが等しい場合は、コード変換は行われない。
コード変換される場合、文字の欠落は考慮する必要がある。
英字圏のオラクルインスタンスに、日本語のNLS_LANGの組み合わせは、? に置き換えれてしまう。
また、EUCに対し、ShiftJISの外字も変換してくれなかった
オラクルインスタンスにアクセスしてくるキャラクタセットが多様な場合は、それらをすべて包含できるキャラクタセットが望ましい。そのためにはAL32UTF8などのUTF系のキャラクタセットが望ましい。
これは、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を確認する。
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_LANG をJA16SJISTILDE にしなくてはならないようだ。
Windowsの場合、
環境変数 NLS_LANG に、
JAPANESE_JAPAN.JA16SJISTILDE を設定する事。
これで、oo4oを経由して取得する時もバケなくなくなった 2005/01/11
http://ash.or.jp/db/ora_nls.htm
オラクルからJDBC経由で、getObject を行うと型を意識せずにデータが取得できるが、うまくいかない時があった。
オラクルのDATE型は、時分秒〜ミリ秒まで保持している。getObjectで取得すると、java.sql.Date型で取れるケースと java.sql.TimeStamp型でとれるケースがあった。同一のオラクルインスタンスに対して、異なるクライアントからアクセスした場合であった。
時刻情報も含めて値を取得したいときに、java.sql.Date 型だと、時分秒が0リセットされた取得してしまう。
原因…不明
対策… getObject で 取得したクラスがjava.sql.Date で取得できた場合は、getTimeStamp を用いて、Timestampを取得するようにした。そうすれば、時分秒を含めて取得する事ができる。