web-dev-qa-db-ja.com

sqlplus、Linuxでのエンコードの問題

私はsqlplusを使用しており、すべての非ラテン文字が「?」として表示されます。選択クエリを実行すると、ラテン語以外の文字を使用して挿入クエリまたは更新クエリを実行すると、Webページに疑問符が表示されます。

select * from nls_database_parameters;NLS_CHARACTERSET: AL32UTF8。 NLS_LANG変数をエクスポートしました:export NLS_LANG=RUSSIAN_CIS.AL32UTF8、ただしこれにより変更は行われませんでした。

何が問題ですか?もちろん、Linux端末でUTF-8を使用しており、スクリプトファイルの内容がcat script.sql

alter session set nls_language='russian' ora-xxxxxメッセージにも疑問符が付きます。

3
ivkremer

データベースの文字セットがAL32UTF8であることを確認したので、フォントがLinuxマシンにインストールされていることを確認し、メッセージライブラリをインストールする必要があります。 alter session set nls_language=を実行すると、ORA_NLS33が設定されたように表示されます。

3
Ahmad Abuhasna

NLS_LANGは、クライアントが使用する文字セットをデータベースに通知するために使用されます。これにより、文字はクライアントとデータベース間で送信されるときに正しく変換されます。 NLS_LANGパラメータを説明し、他の重要な記事への多くの参照が含まれていることを説明するOracle Metalinkの記事があります。

これは必要ないため、データベースで使用されている文字セットをクライアントに通知するためにも使用されません。クライアントはデータベースに接続されているため、データベースの文字セットを認識しています。また、データベースは使用している文字セットを認識しているため、使用している文字セットをデータベースに通知するためにも使用されません。

したがって、NLS_LANGをデータベースの文字セットに設定するだけでは誤りです。データベースのキャラクターデータを破壊する良い方法です

NLS_LANG変数の目的は、unix/windows/...システムが使用している文字セットをOracleクライアントに通知することです。

それでは、NLS_LANG変数を設定するために必要な値は何ですか。 Linuxシステムでは、次のようにします。

 $ロケール
 LANG = 
 LC_CTYPE = en_US.ISO8859-1 
 LC_NUMERIC = C 
 LC_TIME = en_US.ISO8859-1 
 LC_COLLATE = en_US.ISO8859-1 
 LC_MONETARY = en_US.ISO8859-1 
 LC_MESSAGES = C 
 LC_ALL = 

UNIXシステムの文字セットは、LANG、LC_CTYPE、LC_ALLで定義されています。 LANGはLC_CTYPEによってオーバーライドされ、LC_CTYPEはLC_ALLによってオーバーライドされます。したがって、この場合は、NLS_LANG = AMERICAN_AMERICA.WE8ISO8859P1である必要があります。この設定は、データベースの文字セットとは無関係です。

したがって、最初にロケールを確認し、NLS_LANGを適切に設定する必要があります。

他のいくつかの問題が発生する可能性があります。たとえば、データベースがすでにデータを破損しているか、端末が正しく設定されていません。

UNIXロケール設定を説明する2つのリファレンス。 https://unix.stackexchange.com/questions/87745/what-does-lc-all-c-do
http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Locale-Categories.html

2
miracle173