【发布时间】:2018-01-03 11:25:30
【问题描述】:
这些查询的含义和区别是什么?
SELECT U'String' FROM dual;
和
SELECT N'String' FROM dual;
【问题讨论】:
-
奇怪的是
N'是如何在 SQL 语言参考中列出的,而U'却没有。
标签: sql string oracle literals string-literals
这些查询的含义和区别是什么?
SELECT U'String' FROM dual;
和
SELECT N'String' FROM dual;
【问题讨论】:
N' 是如何在 SQL 语言参考中列出的,而 U' 却没有。
标签: sql string oracle literals string-literals
在这个答案中,我将尝试提供来自官方资源的信息
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';
U'' 用于处理 Oracle 调用接口 (OCI) 中的 SQL NCHAR 字符串文字
基于此 Oracle 文档Programming with Unicode
Oracle 调用接口 (OCI) 是其他客户端数据库访问产品使用的最低级别的 API。它为 C/C++ 程序提供了一种灵活的方式来访问存储在 SQL
CHAR和NCHAR数据类型中的 Unicode 数据。使用 OCI,您可以以编程方式为要插入或检索的数据指定字符集(UTF-8、UTF-16 等)。它通过Oracle Net访问数据库。
OCI 是用于访问数据库的最低级别 API,因此它提供了最佳性能。
在 OCI 中处理 SQL NCHAR 字符串文字
您可以通过将环境变量
ORA_NCHAR_LITERAL_REPLACE设置为TRUE来开启它。您还可以通过在OCIEnvCreate()和OCIEnvNlsCreate()中使用OCI_NCHAR_LITERAL_REPLACE_ON和OCI_NCHAR_LITERAL_REPLACE_OFF模式以编程方式实现此行为。因此,例如,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)打开NCHAR文字替换,而OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)将其关闭。[...] 请注意,当
NCHAR文字替换打开时,OCIStmtPrepare和OCIStmtPrepare2将在 SQL 文本中将N'文字转换为U'文字并存储语句句柄中生成的 SQL 文本。因此,如果应用程序使用OCI_ATTR_STATEMENT从OCI语句句柄中检索SQL 文本,SQL 文本将返回U',而不是原始文本中指定的N'。
从数据类型的角度来看,提供的两个查询之间没有区别
【讨论】:
U' 只是C/C++ 语义而不是SQL/PLSQL?
N'<em>string</em>' 只是将<em>string</em> 返回为NCHAR 类型。
U'<em>string</em>' 也返回 NCHAR 类型,但是它对 <em>string</em> 进行了额外的处理:它将 \\ 替换为 \ 和 \<em>xxxx</em> 使用 Unicode 代码点 U+<em>xxxx</em>,其中 @ 987654331@ 是 4 个十六进制数字。这个和UNISTR('<em>string</em>')类似,不同的是后者返回NVARCHAR2。
U' 文字在您想要一个独立于编码和 NLS 设置的 Unicode 字符串时很有用。
例子:
select n'\€', u'\\\20ac', n'\\\20ac' from dual;
N'\€' U'\\\20AC' N'\\\20AC'
----- ---------- ----------
\€ \€ \\\20ac
【讨论】:
当使用N' 时,我们表示给定的数据类型是NCHAR 或NVARCHAR。
U'用于表示unicode
【讨论】: