首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VARCHAR2(10个字符)与NVARCHAR2(10个字符)的区别

VARCHAR2(10个字符)与NVARCHAR2(10个字符)的区别
EN

Stack Overflow用户
提问于 2010-12-22 18:44:35
回答 4查看 164.2K关注 0票数 60

我已经使用默认设置安装了Oracle Database 10g Express Edition (Universal):

代码语言:javascript
运行
复制
SELECT * FROM NLS_DATABASE_PARAMETERS;
代码语言:javascript
运行
复制
NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                

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

代码语言:javascript
运行
复制
VARCHAR2(10 CHAR)
NVARCHAR2(10)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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问题:

票数 88
EN

Stack Overflow用户

发布于 2019-01-03 20:19:02

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

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

现在字符集AL32UTF8是默认的,它完全支持Unicode。在我看来,今天已经没有理由再使用NLS_NCHAR_CHARACTERSET,即NVARCHAR2NCHAR2NCLOB。注意,越来越多的Oracle原生函数不支持NVARCHAR2,因此您应该真正避免使用它。可能唯一的原因是,当您必须主要支持亚洲字符时,与AL32UTF8相比,AL16UTF16消耗的存储空间更少。

票数 8
EN

Stack Overflow用户

发布于 2019-01-10 10:24:31

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

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

  • VARCHAR2VARCHAR2的最大大小可以是字节,也可以是字符。它的列只能存储默认字符集的字符,而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-8UTF-16、....

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

祝你今天愉快!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4508351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档