我是否需要使用 NVARCHAR 而不是 VARCHAR 来在 Oracle 中正确存储 UTF8 字符?

Bes*_*ces 6 oracle character-set

我希望我的 Oracle 数据库能够正确存储所有可能的 UTF8 字符。如果 NLS_CHARSET 设置为 AL32UTF8 就是我需要做的全部吗?或者我是否还需要确保使用 NCHAR 和 NVARCHAR 而不是 CHAR 和 VARCHAR 来正确存储 UTf8 字符?

Phi*_*lᵀᴹ 11

好问题。我会给出一个简单的答案。

Oracle 通过不同的数据类型和参数同时支持两个字符集。“正常”数据库范围的字符集和“国家”字符集。

现在,“正常”字符集会影响VARCHAR2,CHARCLOB数据的存储方式。“国家”字符集影响NVARCHAR2,NCHARNCLOB数据的存储方式。

这些是在数据库创建时指定的。例如:

CREATE DATABASE .... 
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16 
..... BLAH;
Run Code Online (Sandbox Code Playgroud)

您可以通过检查您的数据库来查看这些。例如:

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

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

SQL>
Run Code Online (Sandbox Code Playgroud)

NLS_CHARACTERSET用于CHAR/ VARCHAR2NLS_NCHAR_CHARACTERSET用于NCHAR/ NVARCHAR2

如果您的正常字符集是 UTF%,N%除非您有一些奇怪的国际化要求,否则您通常可以安全地远离数据类型。如果是这样,请随时编辑您的问题!