Oracle中N'String'与U'String'文字的区别

Gan*_*esh 19 sql string oracle literals string-literals

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

SELECT U'String' FROM dual;
Run Code Online (Sandbox Code Playgroud)

SELECT N'String' FROM dual;
Run Code Online (Sandbox Code Playgroud)

Had*_*adi 13

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

(1)N''文字文字

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

根据这个Oracle文档Oracle - Literals

文本文字的语法如下:

在此输入图像描述

where Nn使用国家字符集(NCHARNVARCHAR2数据)指定文字.

另外在第二篇文章Oracle中 - 数据类型

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

从上面列出的文章:

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

SELECT translated_description FROM product_descriptions
  WHERE translated_name = N'LCD Monitor 11/PM';
Run Code Online (Sandbox Code Playgroud)

(2)U''文字

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

基于此Oracle文档使用Unicode编程

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

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

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

你可以通过设置环境变量在其切换ORA_NCHAR_LITERAL_REPLACETRUE.您也可以通过编程方式使用实现这一行为OCI_NCHAR_LITERAL_REPLACE_ON,并OCI_NCHAR_LITERAL_REPLACE_OFF在模式OCIEnvCreate()OCIEnvNlsCreate().因此,例如,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)打开NCHAR文字替换,同时OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)将其关闭.

[...]需要注意的是,当NCHAR面值替换被打开,OCIStmtPrepare并且OCIStmtPrepare2 将改变N'文字与U'在SQL文本文字和存储在语句句柄的结果的SQL文本.因此,如果应用程序使用OCI_ATTR_STATEMENTOCI语句句柄检索SQL文本,则SQL文本将返回U'而不是N'原始文本中指定的.


(3)回答你的问题

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


apo*_*ene 5

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

U' 用于表示unicode

  • 但是nvarchar商店[unicode也](/sf/ask/549791581/)你能解释一下这个区别吗? (4认同)

mik*_*mik 5

  • N'string'只是返回stringas NCHAR类型。

  • U'string'还返回NCHARtype,但是它对进行额外的处理string:用Unicode代码点替换\\\并用Unicode代码点代替,这里有4个十六进制数字。这类似于,区别在于后者返回。\xxxxU+xxxxxxxxUNISTR('string')NVARCHAR2

U' 当您要具有独立于编码和NLS设置的Unicode字符串时,文字是很有用的。

例:

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

N'\€' U'\\\20AC' N'\\\20AC'
----- ---------- ----------
\€    \€         \\\20ac
Run Code Online (Sandbox Code Playgroud)