7

Oracleデータベースに文字列を挿入すると、NCHARまたはNVARCHAR列に挿入されている場合でも、一部の国別文字が疑問符に置き換えられます。これにより、すべてのUnicode文字を処理できるようになります。

これは、OracleのSQL Developer、sqlplus、またはJDBCドライバーのいずれかを使用して発生します。

データベースNLS_CHARACTERSETはWE8ISO8859P1(西ヨーロッパのiso-8859-1)に設定されています。NCHAR列に使用されるNLS_NCHAR_CHARACTERSETはAL16UTF16に設定されています。(UTF-16)

NLS_CHARACTERSETにない文字は、反転した疑問符に置き換えられているようです。

4

2 に答える 2

26

編集:OracleでUTFを処理する最良の方法は、データベース文字セットAL32UTF8を使用してデータベースを作成し、通常のvarchar2列を使用することであることに注意してください。nchar列を使用する際の問題の1つは、引数がデフォルトでncharとして送信される場合、Oracleが通常のchar/varchar2列のインデックスを使用できないことです。

とにかく:データベースを変換できない場合:


まず、Unicodeリテラルには、次のように接頭辞「n」を付ける必要があります。

select n'Language - Språk - Język' from dual;

*)8ビットエンコーディングはこのテキストを処理できません

残念ながら、それだけでは十分ではありません。

何らかの理由で、データベースクライアントのデフォルトの動作は、すべての文字列リテラルをデータベースの文字セットに変換することです。つまり、データベースが文字列を認識できるようになる前でも、値が変更されます。

クライアントは、Unicode文字をNCHARまたはNVARCHAR列に挿入できるようにするために、いくつかの構成が必要です。

Unix上のSQLPlus

これらのenvironemnet変数は、UTF-8ファイルを使用するようにUNIX環境とsqlplusを設定し、Unicodeで文字列リテラルを送信するようにsqlplusを構成します。

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="en_US.UTF-8"
ORA_NCHAR_LITERAL_REPLACE=true

(en_US.UTF-8はSolaris用です-Linuxまたは他のシステムでは異なる文字列が必要になる場合がありますlocale -a。サポートされているロケールを一覧表示するために使用してください。)

JDBCドライバー

OracleのJDBCドライバを使用するアプリケーションでは、文字列リテラルをUnicodeで送信するために、次のシステムプロパティを定義する必要があります。

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true

SQL Developer

sqldeveloper.confを見つけて、次の行を追加します。

AddVMOption -Doracle.jdbc.defaultNChar=true 
AddVMOption -Doracle.jdbc.convertNcharLiterals=true

MicrosoftWindows上のSQLPlus

MicrosoftWindowsまたはToad上のSQLplusがutf-8を処理するかどうかは試していません。Sqlplusw.exeがそれを行う可能性があり、次のレジストリ設定がそのトリックを行う可能性があります。

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true
于 2011-06-28T16:26:56.530 に答える
1

KarlPに感謝します-それは私を動かしました。私のために働いたことを要約します。

Linuxでsqlplusを使用して、非Unicodeデータベース(例:ISO8859など)のnvarchar列に中国語(任意のutf8)テキストを挿入します。

私のシステムのこれらのdbパラメータは、charの場合はシングルバイトエンコーディングですが、nchareの場合はマルチバイトに注意してください。NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET AL16UTF16

例えば:

INSERT INTO tt values ( N'气前照灯' );

文字列の前に「N」を付けることが重要です。また、sqlplusを起動する前にenvを設定する必要があります。

# Important to tell sqldeveloper what encoding is needed.
export NLS_LANG=AMERICAN_AMERICA.UTF8
# Others might find AMERICAN_AMERICA.AL32UTF8 or whatever better suits.

# ** THIS MATTERS - DOES NOT WORK WITHOUT !! 
export ORA_NCHAR_LITERAL_REPLACE=true
于 2017-11-28T18:39:25.063 に答える