ここで簡単な質問があります。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_CHARACTERSET
はVARCHAR2
に使用されます。
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
で実行する前にコードページを変更します。この適切な設定では、おそらく予想したとおりの漢字は表示されません。