我已经使用默认设置安装了Oracle Database 10g Express Edition(通用):

SELECT * FROM NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET               AL32UTF8
NLS_NCHAR_CHARACTERSET         AL16UTF16
鉴于CHARNCHAR数据类型似乎都接受多字节字符串,这两个列定义之间的确切区别是什么?
VARCHAR2(10 CHAR)
NVARCHAR2(10)

最佳答案

Oracle为数据库引入了NVARCHAR2数据类型,该数据库希望对某些列使用Unicode,同时为其余数据库保留另一个字符集(使用VARCHAR2)。 NVARCHAR2是仅Unicode的数据类型。

您可能要使用NVARCHAR2的一个原因可能是您的数据库使用了非Unicode字符集,并且您仍然希望能够在不更改主字符集的情况下为某些列存储Unicode数据。另一个原因可能是您要使用两个Unicode字符集(例如,AL32UTF8用于主要来自西欧的数据,AL16UTF16用于主要来自亚洲的数据),因为不同的字符集不能同样有效地存储相同的数据。

您的示例中的两列(Unicode VARCHAR2(10 CHAR)NVARCHAR2(10))都可以存储相同的数据,但是字节存储将有所不同。某些字符串可以更有效地存储在一个或另一个中。

另请注意,某些功能不适用于NVARCHAR2,请参见以下SO问题:

  • Oracle Text will not work with NVARCHAR2. What else might be unavailable?
  • 08-28 22:58