在Oracle中,N'String'和U'String'字面量之间的区别是什么?

26

这些查询语句的含义和区别是什么?

SELECT U'String' FROM dual;

SELECT N'String' FROM dual;

2
请查看此链接:Oracle: Unicode编程 - Maciej Los
3
很奇怪的是,在SQL语言参考中列出了N',但没有列出U' - Jon Heller
4个回答

16

在这个答案中,我将尝试提供官方资源的信息

(1) N''文本字面量

N''用于将字符串转换为NCHARNVARCHAR2数据类型

根据这份Oracle文档Oracle - Literals

文本字面量的语法如下:

enter image description here

其中Nn指定使用国家字符集(NCHARNVARCHAR2数据)的字面量。

此外,在第二篇文章Oracle - Datatypes

N'String'用于将字符串转换为NCHAR数据类型

从上面列出的文章中:

以下示例将pm.product_descriptions表的translated_description列与国家字符集字符串进行比较:

SELECT translated_description FROM product_descriptions
  WHERE translated_name = N'LCD Monitor 11/PM';
(2) 使用U''可以处理Oracle Call Interface(OCI)中的SQL NCHAR字符串字面量。基于这份Unicode编程文档,OCI是客户端数据库访问产品使用的最低级别API。它为C/C++程序提供了一种灵活的方式来访问存储在SQL CHARNCHAR 数据类型中的Unicode数据。使用OCI,您可以以编程方式指定要插入或检索的数据的字符集(UTF-8、UTF-16 等)。它通过Oracle Net访问数据库。
(3) 从数据类型的角度来看,提供的两个查询之间没有区别。

1
这是否意味着 U' 只是 C/C++ 语义,而不是 SQL/PLSQL 呢? - Álvaro González
根据文档,看起来是正确的。奇怪的是,没有提供任何示例或其他信息。 - Hadi

9
  • N'string' 仅以 NCHAR 类型返回 string

  • U'string' 也返回 NCHAR 类型,但还对 string 进行附加处理:将 \\ 替换为 \,并将 \xxxx 替换为 Unicode 代码点 U+xxxx,其中 xxxx 是 4 个十六进制数字。这类似于 UNISTR('string'),区别在于后者返回 NVARCHAR2

U' 字面量在您想要拥有与编码和 NLS 设置无关的 Unicode 字符串时非常有用。

例:

select n'\€', u'\\\20ac', n'\\\20ac' from dual;

N'\€' U'\\\20AC' N'\\\20AC'
----- ---------- ----------
\€    \€         \\\20ac

5

使用 N' 表示给定的数据类型是 NCHARNVARCHAR

U' 用于表示 Unicode。


4
但是 nvarchar 存储的也是 Unicode,你能否进一步解释它与 varchar 的区别? - Moudiz

0

文档中的 N'' 字面量与标准字符字面量 ('') 相同,除了它们的数据类型为 NVARCHAR2 而不是 VARCHAR2。需要注意的是,这些字面量中的字符连同整个 SQL 语句一起在传输到服务器时从客户端字符集转换为数据库字符集。所有不受数据库字符集支持的字面量中的字符都会丢失。

未记录的 U'' 字面量的数据类型也是 NVARCHAR2。一个 U'' 字面量的内容被解释为 SQL UNISTR 函数的输入。也就是说,每个字符序列 \xxxx,其中每个 x 都是一个十六进制数位,都被解释为 UTF-16 代码点 U+xxxx。我不确定为什么未记录 U'' 字面量。我只能猜测。它们被内部使用于 NCHAR 字面量替换功能,当启用客户端时,该功能会自动将 N'' 字面量转换为 U'' 字面量。这样可以防止由于字符集转换而导致的上述数据丢失,并使得即使数据库字符集不是 Unicode,也能为 NVARCHAR2 列提供字面量 Unicode 数据。

这个主题中的两个查询通常不是等价的,因为字面文本会被解释成不同的方式。然而,如果文字中没有反斜杠,就无法观察到任何差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接