60

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

SELECT * FROM NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                

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

VARCHAR2(10 CHAR)
NVARCHAR2(10)
4

4 回答 4

88

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

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

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

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

于 2010-12-22T13:21:42.033 回答
8

我不认为文森特马尔格拉特的回答是正确的。NVARCHAR2很久以前引入的时候,甚至没有人谈论 Unicode。

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

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

于 2019-01-03T12:19:01.950 回答
6
  • NVARCHAR2存储可变长度字符数据。当您使用列创建表时NVARCHAR2,最大大小始终采用字符长度语义,这也是NVARCHAR2数据类型的默认和唯一长度语义。

    NVARCHAR2数据类型使用在编码AL16UTF16中对 Unicode 数据进行编码的字符集UTF-16用于存储字符AL16UTF162 bytes此外,an 的最大字节长度NVARCHAR2取决于配置的国家字符集。

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

通过将字段定义为:

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

总之:

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

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

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

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

祝你有美好的一天!

于 2019-01-10T02:24:30.767 回答
2

nVarchar2Unicode 的存储。

虽然这两种数据类型都是可变长度字符串数据类型,但您可以注意到它们存储值的方式不同。每个字符都存储在字节中。众所周知,并非所有语言都有相同长度的字母表,例如,英文字母表每个字符需要 1 个字节,但是,像日语或中文这样的语言需要超过 1 个字节来存储一个字符。

当您指定varchar2(10)时,您是在告诉数据库只存储10 个字节的数据。但是,当您说nVarchar2(10)时,这意味着将存储10 个字符。在这种情况下,您不必担心每个字符占用的字节数。

于 2017-12-02T18:57:22.290 回答