这些查询之间的含义和区别是什么?
SELECT U'String' FROM dual;
和
SELECT N'String' FROM dual;
答案 0 :(得分:13)
在这个答案中,我将尝试提供来自官方资源的信息
N''
用于将字符串转换为NCHAR
或NVARCHAR2
数据类型
根据此Oracle文档Oracle - Literals
文本文字的语法如下:
其中
N
或n
使用国家字符集(NCHAR
或NVARCHAR2
数据)指定文字。
同样在第二篇文章Oracle - Datatypes
中 N'String'
用于将字符串转换为NCHAR
数据类型
从上面列出的文章:
以下示例将
translated_description
表的pm.product_descriptions
列与国家字符集字符串进行比较:SELECT translated_description FROM product_descriptions WHERE translated_name = N'LCD Monitor 11/PM';
U''
用于处理Oracle调用接口(OCI)中的SQL NCHAR字符串文字
基于此Oracle文档Programming with Unicode
Oracle Call Interface (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
来启用它。您还可以使用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'
文字转换为{{1 SQL文本中的文字,并将生成的SQL文本存储在语句句柄中。因此,如果应用程序使用U'
从OCI_ATTR_STATEMENT
语句句柄中检索SQL文本, SQL文本将返回OCI
而不是U'
,如原文。
从数据类型的角度来看,提供的两个查询之间没有区别
答案 1 :(得分:5)
使用N'
时,我们表示给定的数据类型为NCHAR
或NVARCHAR
。
U'
用于表示unicode
答案 2 :(得分:5)
N'string'
只会将string
作为NCHAR
类型返回。
U'string'
还会返回NCHAR
类型,但会对string
进行额外处理:它会将\\
替换为\
和{{1} Unicode代码点\xxxx
,其中U+xxxx
是4个十六进制数字。这类似于xxxx
,区别在于后者返回UNISTR('string')
。
NVARCHAR2
文字很有用。
示例:
U'