【问题标题】:Difference between N'String' vs U'String' literals in OracleOracle 中 N'String' 与 U'String' 文字之间的区别
【发布时间】:2018-01-03 11:25:30
【问题描述】:

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

SELECT U'String' FROM dual;

SELECT N'String' FROM dual;

【问题讨论】:

标签: sql string oracle literals string-literals


【解决方案1】:

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

(1) N'' 文本字面量

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

根据这个 Oracle 文档Oracle - Literals

文本字面量的语法如下:

其中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'' 字面量

U'' 用于处理 Oracle 调用接口 (OCI) 中的 SQL NCHAR 字符串文字

基于此 Oracle 文档Programming with Unicode

Oracle 调用接口 (OCI) 是其他客户端数据库访问产品使用的最低级别的 API。它为 C/C++ 程序提供了一种灵活的方式来访问存储在 SQL CHARNCHAR 数据类型中的 Unicode 数据。使用 OCI,您可以以编程方式为要插入或检索的数据指定字符集(UTF-8、UTF-16 等)。它通过Oracle Net访问数据库。

OCI 是用于访问数据库的最低级别 API,因此它提供了最佳性能。

在 OCI 中处理 SQL NCHAR 字符串文字

您可以通过将环境变量ORA_NCHAR_LITERAL_REPLACE 设置为TRUE 来开启它。您还可以通过在OCIEnvCreate()OCIEnvNlsCreate() 中使用OCI_NCHAR_LITERAL_REPLACE_ONOCI_NCHAR_LITERAL_REPLACE_OFF 模式以编程方式实现此行为。因此,例如,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON) 打开 NCHAR 文字替换,而 OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF) 将其关闭。

[...] 请注意,当 NCHAR 文字替换打开时,OCIStmtPrepareOCIStmtPrepare2 将在 SQL 文本中将 N' 文字转换为 U' 文字并存储语句句柄中生成的 SQL 文本。因此,如果应用程序使用OCI_ATTR_STATEMENTOCI 语句句柄中检索SQL 文本,SQL 文本将返回U',而不是原始文本中指定的N'


(3) 回答您的问题

从数据类型的角度来看,提供的两个查询之间没有区别

【讨论】:

  • 这是否意味着U' 只是C/C++ 语义而不是SQL/PLSQL?
  • 根据文档,看起来确实如此。奇怪的是没有提供示例或其他信息。
【解决方案2】:
  • 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

【讨论】:

    【解决方案3】:

    当使用N' 时,我们表示给定的数据类型是NCHARNVARCHAR

    U'用于表示unicode

    【讨论】:

    • 但是 nvarchar 商店 unicode also 你能解释一下不同之处吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2021-05-10
    • 2016-08-11
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多