web-dev-qa-db-ja.com

OracleのNLS_NCHAR_CHARACTERSETとNLS_CHARACTERSETの違い

ここで簡単な質問があります。OracleのNLS_NCHAR_CHARACTERSET設定とNLS_CHARACTERSET設定の違いを知りたいですか?

私の理解から、NLS_NCHAR_CHARACTERSETはNVARCHARデータ型用であり、NLS_CHARACTERSETはVARCHAR2データ型用です。

私はこれを私の開発サーバーでテストしようとしましたが、CHARACTERSETの現在の設定は次のとおりです:-

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               US7ASCII

次に、漢字の値をデータベースに挿入しました。 data_というテーブルに文字を挿入し、VARCHAR2列であるADDRESSおよびADDRESS_2の列を更新しました。 NLS_CHARACTERSET US7ASCIIの現在の設定を理解しているところによると、漢字はサポートされるべきではありませんが、データベースにはまだ表示されていますか? NLS_NCHAR_CHARACTERSETはこれよりも優先されますか?

ありがとうございました。

一般的に、あなたのすべてのポイントは正しいです。 NLS_NCHAR_CHARACTERSETは、NVARCHAR2などの文字セットを定義します。 al。列NLS_CHARACTERSETVARCHAR2に使用されます。

US7ASCIIの漢字が表示されるのはなぜですか?

その理由は、データベースの文字セットとクライアントの文字セット(つまり、NLS_LANGの値を参照)がどちらもUS7ASCIIであるためです。データベースはUS7ASCIIを使用し、クライアントはUS7ASCIIを使用してデータを送信することも「考え」ます。したがって、文字列の変換は行われません。データはビット単位でクライアントからサーバーに、またはその逆に転送されます。

そのため、実際にはUS7ASCIIでサポートされていない文字を使用できます。クライアントが別の文字セットを使用している場合(WindowsアプリケーションでODP.NETマネージドドライバーを使用している場合など)は、データがごみになることに注意してください。また、データベースの文字セットの移行を検討する場合、同じ問題があります。

別のメモ:他の文字セットで同じ動作が得られるとは思いません。たとえば、データベースとクライアントの両方がWE8ISO8859P1を使用する場合。また、実際の構成が間違っていることにも注意してください。データベースは文字セットUS7ASCIIを使用し、NLS_LANGの値もUS7ASCII(ほとんど設定されておらず、OracleはデフォルトでUS7ASCIIにデフォルト設定しています)ですが、実際の文字セットです。 SQL * Plus、それぞれあなたのcmd.exe端末は、おそらく CP95 または CP936 です。

すべてを適切に設定したい場合は、環境変数NLS_LANG=.ZHT16MSWIN950(CP936はOracleではサポートされていないようです)を設定するか、sqlplus.exeをコマンドchcp 437で実行する前にコードページを変更します。この適切な設定では、おそらく予想したとおりの漢字は表示されません。

7