NLS 関連初期化パラメータ(NLS 環境変数)

NLS_〜 パラメータは各国語サポート用のパラメータで、DATABASE、INSTANCE、SESSION と 3 段階があり、その値には列挙タイプのパラメータ、フォーマット指定などの任意の文字列での指定を行う。
また、一部のパラメータは接続クライアントからの同じ名前の環境変数を使用して ユーザー・プロセス の動作環境を変更することができる。

すべてのパラメータが環境変数と対になっているわけではない。
NLS_LANG 環境変数は {NLS_LANGUAGE}_{NLS_TERRITORY}.{NLS_CHARACTERSET} であらわし、同時にそのユーザー・プロセスにおける 3つの NLS 初期化パラメータを設定する。しかし、NLS_CHARACTERSET は環境変数に設定しても効果がない。

NLS パラメータ (一部抜粋)

パラメータ設定値(設定内容の例)別の代表的な設定例
NLS_CALENDARGREGORIANJAPANESE IMPERIAL
NLS_CHARACTERSETAL32UTF8JA16SJISTILDE
NLS_COMPBINARYLINGUISTIC Oracle 10g
BYTE、ANSI の三択 ANSI は下位互換用
NLS_CURRENCY¥
NLS_DATE_FORMATYYYY/MM/DD HH24:MI:SSRR-MM-DD HH24:MI:SS
書式モデル(日付)を参考
NLS_DATE_LANGUAGEJAPANESEAMERICAN
NLS_DUAL_CURRENCY¥
NLS_ISO_CURRENCYJAPAN
NLS_LANGUAGEJAPANESEAMERICAN
NLS_LENGTH_SEMANTICS Oracle 9iBYTECHAR(BINARY と二択)
NLS_NCHAR_CHARACTERSETAL16UTF16UTF8*1
NLS_NCHAR_CONV_EXCP Oracle 9iFALSE
NLS_NUMERIC_CHARACTERS.,,.*2
NLS_RDBMS_VERSION10.1.0.2.0
NLS_SORTBINARYJAPANESE_M*3
(JAPANESE_M_CI)
NLS_TERRITORYJAPAN
NLS_TIMESTAMP_FORMAT Oracle 9iRR-MM-DD HH24:MI:SSXFF書式モデル(日付)を参考
NLS_TIMESTAMP_TZ_FORMAT Oracle 9iRR-MM-DD HH24:MI:SSXFF TZR
NLS_TIME_FORMATHH24:MI:SSXFF
NLS_TIME_TZ_FORMATHH24:MI:SSXFF TZR

NLS_* パラメータの現在の値を調べる

V$NLS_PARAMETERS ビューに格納されている。
データベースの OS 関連情報を取得する

SQL> select * from v$nls_parameters;
 
PARAMETER                  VALUE
-------------------------- ------------------------------
NLS_CALENDAR               GREGORIAN
NLS_CHARACTERSET           JA16EUCTILDE
NLS_COMP                   BINARY
NLS_CURRENCY               \
NLS_DATE_FORMAT            YYYY-MM-DD HH24:MI:SS
NLS_DATE_LANGUAGE          JAPANESE
NLS_DUAL_CURRENCY          \
NLS_ISO_CURRENCY           JAPAN
NLS_LANGUAGE               JAPANESE
NLS_LENGTH_SEMANTICS       BYTE
NLS_NCHAR_CHARACTERSET     AL16UTF16
NLS_NCHAR_CONV_EXCP        FALSE
NLS_NUMERIC_CHARACTERS     .,
NLS_SORT                   BINARY
NLS_TERRITORY              JAPAN
NLS_TIMESTAMP_FORMAT       YYYY-MM-DD HH24:MI:SS
NLS_TIMESTAMP_TZ_FORMAT    RR-MM-DD HH24:MI:SSXFF TZR
NLS_TIME_FORMAT            HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT         HH24:MI:SSXFF TZR

NLS_CALENDAR

SQL> ALTER SESSION SET NLS_CALENDAR='JAPANESE IMPERIAL';
 
セッションが変更されました。
 
SQL> SELECT SYSDATE FROM DUAL;
 
SYSDATE                                                                         
------------------------------------------                                      
平成17年08月13日                                                                
 
SQL> ALTER SESSION SET NLS_CALENDAR='GREGORIAN';
セッションが変更されました。
 
SQL> SELECT SYSDATE FROM DUAL;
 
SYSDATE                                                                         
--------                                                                        
05-08-13

NLS_DATE_LANGUAGE

暦(月、曜日)をあらわす言語の指定、Oracle 10g から月の名前('MON')が日本語名に変更されている。
デフォルト値は NLS_LANGUAGE を継承

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='JAPANESE';
セッションが変更されました。
 
SQL> SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM DUAL;
SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM DUAL
                         *
行1でエラーが発生しました。:
ORA-01846: 指定した曜日が無効です。 
 
 
SQL> SELECT NEXT_DAY(SYSDATE, '月曜') FROM DUAL;
 
NEXT_DAY(SYSDATE,'                                                              
-------------------                                                             
2005/08/08 23:08:12                                                             
 
SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
セッションが変更されました。
 
SQL> SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM DUAL;
 
NEXT_DAY(SYSDATE,'M                                                             
-------------------                                                             
2005/08/08 23:08:12                                                             
 
SQL> SELECT NEXT_DAY(SYSDATE, '月曜') FROM DUAL;
SELECT NEXT_DAY(SYSDATE, '月曜') FROM DUAL
                         *
行1でエラーが発生しました。:
ORA-01846: 指定した曜日が無効です。

NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT 、NLS_TIMESTAMP_TZ_FORMAT

  • DATE 型は NLS_DATE_FORMAT
  • タイムスタンプ型は NLS_TIMESTAMP_FORMAT
  • タイムゾーン付のタイムスタンプ型は NLS_TIMESTAMP_TZ_FORMAT

のパラメータでフォーマットされる

SQL> SELECT SYSDATE FROM DUAL ;
 
SYSDATE
--------
05-02-11
 
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
セッションが変更されました。
 
SQL> SELECT SYSDATE FROM DUAL;
 
SYSDATE
-------------------
2005-02-11 15:15:10
 
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'RR-MM-DD HH24:MI:SSXFF';
...略
SQL> SELECT LOCALTIMESTAMP  FROM DUAL;
 
LOCALTIMESTAMP
------------------------
05-02-11 15:15:23.336681
 
SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT= 'RR-MM-DD HH24:MI:SSXFF3 TZR';
...略
SQL> SELECT SYSTIMESTAMP  FROM DUAL;
 
SYSTIMESTAMP
---------------------------------------------------------------------------
05-02-11 15:15:32.445 +09:00

NLS_LENGTH_SEMANTICS

NLS_LENGTH_SEMANTICS を 'CHAR' にすると文字列の指定は CHAR 単位になる。BYTE 単位にしたい場合には明示的に指定しなければならない。

SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR';
 
セッションが変更されました。
 
SQL> CREATE TABLE CHARBASE_TABLE(
  2      NAME1  VARCHAR2(5),
  3      NAME2  VARCHAR2(5 BYTE)
  4  );
 
表が作成されました。
 
SQL> DESC CHARBASE_TABLE
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 NAME1                                              VARCHAR2(5)
 NAME2                                              VARCHAR2(5 BYTE)
 
SQL> INSERT INTO CHARBASE_TABLE VALUES ('あいうえお', '12345');
 
1行が作成されました。
 
SQL> INSERT INTO CHARBASE_TABLE VALUES ('123456', 'あい');
INSERT INTO CHARBASE_TABLE VALUES ('123456', 'あい')
                                   *
行1でエラーが発生しました。:
ORA-12899: 列"RIVUS"."CHARBASE_TABLE"."NAME1"の値が大きすぎます(実際: 6、最大:
5) 
 
 
SQL> INSERT INTO CHARBASE_TABLE VALUES ('12345', 'あいう');
INSERT INTO CHARBASE_TABLE VALUES ('12345', 'あいう')
                                            *
行1でエラーが発生しました。:
ORA-12899: 列"RIVUS"."CHARBASE_TABLE"."NAME2"の値が大きすぎます(実際: 6、最大:
5) 
 
 
SQL> INSERT INTO CHARBASE_TABLE VALUES ('あいうえお', 'あい');
 
1行が作成されました。
 
SQL> 
SQL> SELECT * FROM CHARBASE_TABLE ;
 
NAME1      NAME2                                                                
---------- ----------                                                           
あいうえお 12345                                                                
あいうえお あい                                                                 
 
SQL> 
SQL> DROP TABLE CHARBASE_TABLE;
 
表が削除されました。

NLS_TERRITORY

NLS_TERRITORY により影響のある項目 カッコ内は日本仕様

  • 日付書式 (RR-MM-DD)
  • 時刻の書式 (hh24:MI:SS)
  • 週初めの曜日(日曜) ISO は月曜
  • 小数点文字とグループ・セパレータ(,.)
  • 通貨記号 (¥)
  • ISO 通貨記号 (JPY)

以下はよくわかりません。

  • 貸方および借方記号 ⇒ NLS_CREDIT(' ':空白) / NLS_DEBIT(-:マイナス) : 書式フォーマットに影響する?
  • ISO 週フラグ ( ? ) IW 書式に影響(年の最初の暦週:日曜/月曜)?
  • リスト・セパレータ(カンマ(,) でない国がある? )

NLS_LANGUAGE

NLS_LANGUAGEのより影響のある項目 カッコ内は日本仕様

  • サーバー・メッセージの言語 エラーメッセージが日本語になる。
  • 月の名称 (数値のまま) 、Oracle 10g では '1月' などになる。
  • 曜日の名称(日曜〜土曜)
  • ソート順 (デフォルトではバイナリ)
  • 書き込み方向(左から右へ)
  • 「はい、いいえ」の選択肢が必要なときの入力文字列 (たぶん YES、NO )

NLS_SORT

JAPANESE_M_CI を使用すると大文字、小文字、半角、全角を区別しないで扱うことができる。

 


関連ディクショナリビュー

V$NLS_PARAMETERS
V$SESSION_CONNECT_INFO
NLS_DATABASE_PARAMETERS
NLS_INSTANCE_PARAMETERS
NLS_SESSION_PARAMETERS

関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー