VARCHAR2(10 CHAR)和NVARCHAR2(10)之间的区别

时间:2010-12-22 10:44:35

标签: oracle oracle-xe

我使用默认设置安装了Oracle数据库10g快捷版(通用版):

SELECT * FROM NLS_DATABASE_PARAMETERS;

NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                

鉴于CHARNCHAR数据类型似乎都接受多字节字符串,这两个列定义之间的确切区别是什么?

VARCHAR2(10 CHAR)
NVARCHAR2(10)

4 个答案:

答案 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提供了VARCHAR2NVARCHAR2来支持本地化。公用数据(包括PL / SQL)保存在VARCHAR2中,最近很可能保存在US7ASCII中。然后,您可以为任何国家/地区的每个客户分别申请NLS_NCHAR_CHARACTERSET(例如WE8ISO8859P1),而无需接触应用程序的共同部分。

现在的字符集AL32UTF8是完全支持Unicode的默认字符集。我认为今天没有理由再使用NLS_NCHAR_CHARACTERSET,即NVARCHAR2NCHAR2NCLOB。也许唯一的原因是您必须主要支持亚洲字符,与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-8UTF-16,....

有关更多详细信息,请查看this tutorial

祝你有美好的一天!