我已经使用默认设置安装了Oracle Database 10g Express Edition (Universal):
SELECT * FROM NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
假设CHAR
和NCHAR
数据类型似乎都接受多字节字符串,那么这两个列定义之间的确切区别是什么?
VARCHAR2(10 CHAR)
NVARCHAR2(10)
发布于 2010-12-22 21:21:42
NVARCHAR2数据类型是由Oracle为数据库引入的,这些数据库希望对某些列使用Unicode,同时为数据库的其余部分(使用VARCHAR2)保留另一个字符集。NVARCHAR2是仅限Unicode的数据类型。
您可能希望使用NVARCHAR2的一个原因可能是,您的数据库使用非Unicode字符集,并且您仍然希望能够在不更改主字符集的情况下存储某些列的Unicode数据。另一个原因可能是您希望使用两个Unicode字符集(例如,AL32UTF8用于主要来自西欧的数据,AL16UTF16用于主要来自亚洲的数据),因为不同的字符集不会以同样的效率存储相同的数据。
示例中的两列(Unicode VARCHAR2(10 CHAR)
和NVARCHAR2(10)
)将能够存储相同的数据,但是字节存储将有所不同。一些字符串可以更有效地存储在其中一个或另一个中。
另请注意,一些功能不能与NVARCHAR2一起工作,请参阅此SO问题:
发布于 2019-01-03 20:19:02
我不认为文森·马尔格拉特的回答是正确的。很久以前,当NVARCHAR2
被引入的时候,甚至还没有人谈论。
最初,甲骨文提供了VARCHAR2
和NVARCHAR2
来支持本地化。公共数据(包括PL/SQL)保存在VARCHAR2
中,现在很可能是US7ASCII
。然后,您可以为任何国家/地区的每个客户单独应用NLS_NCHAR_CHARACTERSET
(例如WE8ISO8859P1
),而无需触及应用程序的公共部分。
现在字符集AL32UTF8
是默认的,它完全支持Unicode。在我看来,今天已经没有理由再使用NLS_NCHAR_CHARACTERSET
,即NVARCHAR2
,NCHAR2
,NCLOB
。注意,越来越多的Oracle原生函数不支持NVARCHAR2,因此您应该真正避免使用它。可能唯一的原因是,当您必须主要支持亚洲字符时,与AL32UTF8
相比,AL16UTF16
消耗的存储空间更少。
发布于 2019-01-10 10:24:31
NVARCHAR2
存储可变长度的字符数据。在创建具有NVARCHAR2
列的表时,最大大小始终采用字符长度语义,这也是NVARCHAR2
数据类型的默认且唯一的长度语义。Unicode数据类型使用AL16UTF16
字符集,该字符集以UTF-16
编码对NVARCHAR2
数据进行编码。AL16UTF16
使用2 bytes
来存储字符。此外,NVARCHAR2
的最大字节长度取决于配置的国家字符set.
VARCHAR2
。VARCHAR2
的最大大小可以是字节,也可以是字符。它的列只能存储默认字符集的字符,而NVARCHAR2
几乎可以存储任何字符。单个字符可能最多需要4 bytes
.通过将该字段定义为:
你告诉
VARCHAR2(10 CHAR)
,它可以使用足够的空间来存储10个字符,无论存储每个字符需要多少字节。单个字符可能需要高达4 bytes
.NVARCHAR2(10)
您告诉Oracle它可以存储10个字符,每个字符使用2 bytes
摘要中的:
VARCHAR2(10 CHAR)
可以存储10 characters
的最大值和40 bytes
的最大值(取决于配置的国家字符)。set).NVARCHAR2(10)
可以存储10 characters
的最大值和20 bytes
的最大值(取决于配置的国家字符集)。注意:字符集可以是UTF-8
、UTF-16
、....
有关更多详细信息,请查看this tutorial。
祝你今天愉快!
https://stackoverflow.com/questions/4508351
复制相似问题