我使用默认设置安装了Oracle数据库10g快捷版(通用版):
SELECT * FROM NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
鉴于CHAR
和NCHAR
数据类型似乎都接受多字节字符串,这两个列定义之间的确切区别是什么?
VARCHAR2(10 CHAR)
NVARCHAR2(10)
答案 0 :(得分:85)
Oracle引入了NVARCHAR2数据类型,用于希望对某些列使用Unicode,同时为数据库的其余部分(使用VARCHAR2)保留另一个字符集的数据库。 NVARCHAR2是仅限Unicode的数据类型。
您可能希望使用NVARCHAR2的一个原因可能是您的数据库使用非Unicode字符集,并且您仍希望能够在不更改主要字符集的情况下为某些列存储Unicode数据。另一个原因可能是您想要使用两个Unicode字符集(AL32UTF8用于主要来自西欧的数据,AL16UTF16用于主要来自亚洲的数据),因为不同的字符集不会同等有效地存储相同的数据。 / p>
示例中的两列(Unicode VARCHAR2(10 CHAR)
和NVARCHAR2(10)
)都能够存储相同的数据,但字节存储会有所不同。某些字符串可以更有效地存储在一个或另一个中。
另请注意,某些功能不适用于NVARCHAR2,请参阅此SO问题:
答案 1 :(得分:3)
我认为Vincent Malgrat的回答不正确。很久以前NVARCHAR2
被引入时,没人在谈论Unicode。
最初,Oracle提供了VARCHAR2
和NVARCHAR2
来支持本地化。公用数据(包括PL / SQL)保存在VARCHAR2
中,最近很可能保存在US7ASCII
中。然后,您可以为任何国家/地区的每个客户分别申请NLS_NCHAR_CHARACTERSET
(例如WE8ISO8859P1
),而无需接触应用程序的共同部分。
现在的字符集AL32UTF8
是完全支持Unicode的默认字符集。我认为今天没有理由再使用NLS_NCHAR_CHARACTERSET
,即NVARCHAR2
,NCHAR2
,NCLOB
。也许唯一的原因是您必须主要支持亚洲字符,与AL16UTF16
相比,AL32UTF8
占用的存储空间更少。
答案 2 :(得分:1)
nVarchar2 是仅限的存储空间。
虽然两种数据类型都是可变长度的String数据类型,但您可以注意到它们存储值的方式不同。 每个字符都以字节存储。众所周知,并非所有语言都有相同长度的字母,例如,英文字母每个字符需要1个字节,但是,日语或中文等语言需要超过1个字节来存储字符。
当您指定 varchar2(10)时,您告诉数据库只会存储 10个字节的数据。但是,当您说 nVarchar2(10)时,表示将存储 10个字符。在这种情况下,您不必担心每个字符占用的字节数。
答案 3 :(得分:1)
NVARCHAR2
存储长度可变的字符数据。当你
用NVARCHAR2
列创建表,最大大小始终为
在字符长度语义中,这也是默认值,也是唯一的
NVARCHAR2
数据类型的长度语义。
NVARCHAR2
数据类型使用AL16UTF16
个字符集,该字符集以UTF-16
编码对Unicode数据进行编码。 AL16UTF16
使用2 bytes
存储字符。另外,NVARCHAR2
的最大字节长度取决于配置的国家字符集。
VARCHAR2
VARCHAR2
的最大大小可以为字节或字符。它的列只能存储默认字符中的字符
设置NVARCHAR2
几乎可以存储任何字符。一个字符最多可能需要4 bytes
。
通过将字段定义为:
VARCHAR2(10 CHAR)
,您告诉Oracle它可以使用足够的空间来存储10
字符,无论存储每个字节需要多少字节。一个字符最多可能需要4 bytes
。NVARCHAR2(10)
您告诉Oracle它可以存储10个字符,每个字符2 bytes
摘要:
VARCHAR2(10 CHAR)
最多可以存储10 characters
和最多40 bytes
(取决于配置的国家字符集)。
NVARCHAR2(10)
最多可以存储10 characters
和最多20 bytes
(取决于配置的国家字符集)。
注意:字符集可以是UTF-8
,UTF-16
,....
有关更多详细信息,请查看this tutorial。
祝你有美好的一天!