这些查询语句的含义和区别是什么?
SELECT U'String' FROM dual;
和
SELECT N'String' FROM dual;
这些查询语句的含义和区别是什么?
SELECT U'String' FROM dual;
和
SELECT N'String' FROM dual;
在这个答案中,我将尝试提供官方资源的信息
N''
用于将字符串转换为NCHAR
或NVARCHAR2
数据类型
根据这份Oracle文档Oracle - Literals
文本字面量的语法如下:
其中
N
或n
指定使用国家字符集(NCHAR
或NVARCHAR2
数据)的字面量。
此外,在第二篇文章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 CHAR
和 NCHAR
数据类型中的Unicode数据。使用OCI,您可以以编程方式指定要插入或检索的数据的字符集(UTF-8、UTF-16 等)。它通过Oracle Net访问数据库。U'
只是 C/C++ 语义,而不是 SQL/PLSQL 呢? - Álvaro GonzálezN'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
使用 N'
表示给定的数据类型是 NCHAR
或 NVARCHAR
。
U'
用于表示 Unicode。
文档中的 N''
字面量与标准字符字面量 (''
) 相同,除了它们的数据类型为 NVARCHAR2 而不是 VARCHAR2。需要注意的是,这些字面量中的字符连同整个 SQL 语句一起在传输到服务器时从客户端字符集转换为数据库字符集。所有不受数据库字符集支持的字面量中的字符都会丢失。
未记录的 U''
字面量的数据类型也是 NVARCHAR2。一个 U''
字面量的内容被解释为 SQL UNISTR
函数的输入。也就是说,每个字符序列 \xxxx
,其中每个 x
都是一个十六进制数位,都被解释为 UTF-16 代码点 U+xxxx。我不确定为什么未记录 U''
字面量。我只能猜测。它们被内部使用于 NCHAR 字面量替换功能,当启用客户端时,该功能会自动将 N''
字面量转换为 U''
字面量。这样可以防止由于字符集转换而导致的上述数据丢失,并使得即使数据库字符集不是 Unicode,也能为 NVARCHAR2 列提供字面量 Unicode 数据。
这个主题中的两个查询通常不是等价的,因为字面文本会被解释成不同的方式。然而,如果文字中没有反斜杠,就无法观察到任何差异。
N'
,但没有列出U'
。 - Jon Heller