1

Oracle 11g r2 を使用しており、言語ソートを使用してソート順を設定するように DB を構成しようとしています。やった

alter system set NLS_SORT='RUSSIAN' SCOPE=SPFILE;
alter system set NLS_COMP='LINUGUISTIC' SCOPE=SPFILE;

Oracleを再起動した後、これらのパラメーターを確認しました:

show parameters NLS_SORT;
show parameters NLS_COMP;

それは私に正しい値を示しています。しかし、並べ替えると

select name from test order by name; 

結果が正しくない順序で表示されます。つまり、最初に数字、次に文字です。

しかし、もし私がするなら

alter session set nls_sort='RUSSIAN';
alter session set nls_comp='LINGUISTIC';
select name from test order by name; 

それは私に正しい順序を示しています。

システムの変更が正しい結果を表示しない理由を知っている人はいますか?

4

4 に答える 4

2

さまざまなレベルで NLS パラメータを設定できます

  1. インスタンス/サーバーの初期化パラメータとして。

    SQL> alter system set V$NLS_PARAMETER = 'XXX' scope = both;
    
  2. クライアントの環境変数として。

    % setenv NLS_SORT FRENCH
    
  3. ALTER SESSION パラメータとして。

    SQL> ALTER SESSION SET V$NLS_PARAMETER =  = 'XXX'
    

任意の設定は、上位レベルの設定をオーバーライドします。そのため、サーバー側で設定しても、接続しているすべてのクライアントでその設定が使用されるとは限りません。

接続しているすべてのクライアントに対して設定されていることを確認したい場合は、ログオン トリガーを使用します。それでも、ユーザーは「デフォルト」設定を明示的にオーバーライドできます

于 2012-11-22T12:25:39.903 に答える
2

グローバリゼーション設定の優先度はドキュメントに示されています。そのリストで「初期化パラメータ ファイルで指定」の優先度 4 を設定しています。優先度 1 (「SQL 関数で明示的に設定」) を設定しておらず、優先度 2 (「ALTER SESSION ステートメントによって設定」) を設定すると、必要な結果が得られます。「正しくない」順序が優先度 3 の「環境変数として設定」の影響を受けていることを示す消去法によって。

で、セッションで実際に使用されている値を確認できますselect * from nls_session_parameters

NLS_SORT環境変数が直接設定されていない可能性があります。から派生していると思われます。NLS_LANGUAGEこれは から派生していNLS_LANGます。オペレーティング システム環境で明示的に設定していない場合、クライアントはオペレーティング システムのロケールに基づいて設定しますが、使用する正確なクライアントによって大きな違いが生じる可能性があります。NLS_COMPデータベースのデフォルトが実際にオーバーライドされている場合は、環境変数を明示的に設定する必要がある場合があります。

たとえば、SQL Developerでは、プリファレンス(「ツール」→「プリファレンス」→「データベース」→「NLS」からアクセス)でNLS設定を指定できます。Windows では、デフォルトはオペレーティング システムの設定に基づいているようです。SQL*Plus の場合、オペレーティング システムの環境変数を設定する必要があります。

これはまた、ある場所で動作する場合、たとえばSQL Developerから実行するとクエリが正しい順序を与える場合、たとえば独自のロケール設定を持つJDBCを介して別の場所で使用すると動作しない可能性があることを意味します。注意すべきことだけです。

コマンドをログイン トリガーに追加するのが強引な方法かもしれませんがalter session、環境構成をマスクするだけなので、理想的とは言えません。

于 2012-11-22T12:27:21.820 に答える
1

システム設定に関係なく、アプリケーションが必要とする NLS 環境を完全に指定できるように、あらゆる努力をいたします。特に、新しくセットアップされた、または他のシステムと共有されている可能性のあるさまざまな環境でアプリケーションコードを指す必要がある場合は、はるかに堅牢です.

実際、システム レベルの環境設定を使用しない方がよいとまで言えます。

于 2012-11-22T11:34:24.703 に答える