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

时间:2018-01-03 11:25:31

标签: sql string oracle literals string-literals

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

SELECT U'String' FROM dual;

SELECT N'String' FROM dual;

3 个答案:

答案 0 :(得分:13)

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

(1)N'' text Literal

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

根据此Oracle文档Oracle - Literals

  

文本文字的语法如下:

     

enter image description here

     

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

同样在第二篇文章Oracle - Datatypes

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

从上面列出的文章:

  

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

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

  

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

  

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

     

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

     

[...]请注意,启用NCHAR文字替换后,OCIStmtPrepareOCIStmtPrepare2 会将N'文字转换为{{1 SQL文本中的文字,并将生成的SQL文本存储在语句句柄中。因此,如果应用程序使用U'OCI_ATTR_STATEMENT语句句柄中检索SQL文本, SQL文本将返回OCI而不是U',如原文

(3)回答你的问题

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

答案 1 :(得分:5)

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

U'用于表示unicode

答案 2 :(得分:5)

  • N'string'只会将string作为NCHAR类型返回。

  • U'string'还会返回NCHAR类型,但会对string进行额外处理:它会将\\替换为\和{{1} Unicode代码点\xxxx,其中U+xxxx是4个十六进制数字。这类似于xxxx,区别在于后者返回UNISTR('string')

当您希望Unicode字符串独立于编码和NLS设置时,

NVARCHAR2文字很有用。

示例:

U'