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

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

SELECT * FROM NLS_DATABASE_PARAMETERS; NLS_CHARACTERSET AL32UTF8 NLS_NCHAR_CHARACTERSET AL16UTF16 

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

 VARCHAR2(10 CHAR) NVARCHAR2(10) 

Oracle为数据库引入了NVARCHAR2数据types,该数据库要为某些列使用Unicode,同时为数据库的其余部分(使用VARCHAR2)保留另一个字符集。 NVARCHAR2是仅Unicode的数据types。

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

你的例子中的两列(Unicode VARCHAR2(10 CHAR)NVARCHAR2(10) )将能够存储相同的数据,但是字节存储将是不同的。 一些string可以更有效地存储在一个或另一个string中。

还要注意,一些function不能与NVARCHAR2一起工作,看到这个问题:

  • Oracle Text不适用于NVARCHAR2。 还有什么可能不可用?

我想知道NVARCHAR2(1)和VARCHAR2(1)对于空/空值的行为是不一样的吗?

从testing,似乎一样..

可以得到一些惊喜

即比较空string!='Y'将不会返回空string行。即空string也不等于'Y'…

需要nvl包装function
例如nvl(upper(WP。“OW_IS_MISRUN”),'N')!='Y'

从“DATA_HUB”中select计数(*)“OW_WELL_PERFORATION”WP其中WP.UWI = 17038046

7

从“DATA_HUB”select计数(*)“OW_WELL_PERFORATION”WP其中WP.UWI = 17038046和upper(WP。“OW_IS_MISRUN”)!='Y'

1

从“DATA_HUB”中select计数(*)“OW_WELL_PERFORATION”WP其中WP.UWI = 17038046和upper(WP。“OW_IS_MISRUN”)='Y'

2

从“DATA_HUB”中select计数(*)。“OW_WELL_PERFORATION”WP其中WP.UWI = 17038046和nvl(上(WP。“OW_IS_MISRUN”),'N')!='Y'