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

Álv*_*lez 54 oracle oracle-xe

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

SELECT * FROM NLS_DATABASE_PARAMETERS;

NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                
Run Code Online (Sandbox Code Playgroud)

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

VARCHAR2(10 CHAR)
NVARCHAR2(10)
Run Code Online (Sandbox Code Playgroud)

Vin*_*rat 86

NVARCHAR2数据类型被甲骨文介绍了该要使用Unicode某些列,同时保持其他字符集的数据库的其余部分(使用VARCHAR2)数据库.NVARCHAR2是仅限Unicode的数据类型.

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

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

另请注意,某些功能不适用于NVARCHAR2,请参阅此SO问题:


Wer*_*eit 7

我认为 Vincent Malgrat 的回答不正确。当NVARCHAR2介绍很久以前没有人甚至在谈论统一。

最初 Oracle 提供VARCHAR2NVARCHAR2支持本地化。公共数据(包括 PL/SQL)保存在 中VARCHAR2,最近很可能US7ASCII。然后,您可以NLS_NCHAR_CHARACTERSET单独(例如WE8ISO8859P1)为您在任何国家/地区的每个客户申请,而无需触及您申请的公共部分。

现在字符集AL32UTF8是完全支持 Unicode 的默认设置。在我看来,今天没有理由再使用NLS_NCHAR_CHARACTERSET,即NVARCHAR2NCHAR2NCLOB。请注意,越来越多的 Oracle 本机函数不支持 NVARCHAR2,因此您应该避免使用它。也许唯一的原因是当您必须主要支持亚洲字符时,AL16UTF16AL32UTF8.

  • 我很容易假设了 `N...` 类型的 Unicode 性质,因为我也使用 SQL Server,它*显然*(我不是任何一个 DBMS 的专家)将 VARCHAR/NVARCHAR 链接到 ANSI/Unicode Windows 代码页,但当然甲骨文要老得多。在实践中,对于可重新分发的应用程序,也许可以将 `N...` 作为潜在的不那么引人注目的选项。公司在共享实例中运行非常旧的遗留软件,并且在 VARCHAR2 中获得 Unicode 的可能性比在 NVARCHAR2 中要小。 (2认同)

Chi*_*orn 6

  • NVARCHAR2存储可变长度的字符数据。使用NVARCHAR2列创建表时,最大大小始终采用字符长度语义,这也是NVARCHAR2数据类型的默认且唯一的长度语义。

    NVARCHAR2数据类型使用AL16UTF16的字符集,其在编码的Unicode数据UTF-16编码。AL16UTF16使用2 bytes存储一个字符。此外,a 的最大字节长度NVARCHAR2取决于配置的国家字符集。

  • VARCHAR2的最大大小VARCHAR2可以是字节或字符。它的列只能存储默认字符集中的字符,而NVARCHAR2实际上可以存储任何字符。单个字符最多可能需要4 bytes.

通过将字段定义为:

  • VARCHAR2(10 CHAR)您告诉 Oracle 它可以使用足够的空间来存储 10 个字符,无论存储每个字符需要多少字节。单个字符最多可能需要4 bytes.
  • NVARCHAR2(10) 你告诉 Oracle2 bytes每个字符可以存储 10个字符

总之:

  • VARCHAR2(10 CHAR) 可以存储最大值10 characters和最大值40 bytes(取决于配置的国家字符集)。

  • NVARCHAR2(10) 可以存储最大值10 characters和最大值20 bytes(取决于配置的国家字符集)。

注意:字符集可以是UTF-8, UTF-16,....

请查看本教程以获取更多详细信息。

祝你有美好的一天!