web-dev-qa-db-ja.com

OracleでUTF8文字を適切に格納するには、VARCHARではなくNVARCHARを使用する必要がありますか?

Oracleデータベースに、すべての可能なUTF8文字を適切に格納してもらいたい。 NLS_CHARSETがAL32UTF8に設定されている場合、それで十分ですか。または、UTf8文字を適切に格納するために、CHARとVARCHARではなくNCHARとNVARCHARを使用していることを確認する必要がありますか?

6
BestPractices

良い質問。簡単な答えを示します。

Oracleは、異なるデータ型とパラメータを使用して、2つの文字セットを同時にサポートします。 「通常の」データベース全体の文字セットと「国の」文字セット。

現在、「通常」の文字セットは、VARCHAR2CHAR、およびCLOBデータの格納方法に影響を与えます。 「国別」の文字セットは、NVARCHAR2NCHAR、およびNCLOBデータの格納方法に影響します。

これらは、データベースの作成時に指示されます。例えば:

CREATE DATABASE .... 
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16 
..... BLAH;

これらは、DBをチェックインすることで確認できます。例えば:

SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET';

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET               WE8MSWIN1252
NLS_NCHAR_CHARACTERSET         AL16UTF16

SQL>

NLS_CHARACTERSETCHAR/VARCHAR2用、NLS_NCHAR_CHARACTERSETNCHAR/NVARCHAR2用です。

通常の文字セットがUTF%である場合、奇妙な国際化の要件がない限り、通常はN%データ型から離れても安全です。その場合は、質問を自由に編集してください。

11
Philᵀᴹ