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
在这个答案中,我将尝试提供官方资源的信息
N''
用于将字符串转换为NCHAR
或NVARCHAR2
数据类型
根据这个Oracle文档Oracle - Literals
文本文字的语法如下:
where
N
或n
使用国家字符集(NCHAR
或NVARCHAR2
数据)指定文字.
另外在第二篇文章Oracle中 - 数据类型
该N'String'
用于字符串转换为NCHAR
数据类型
从上面列出的文章:
以下示例将表的
translated_description
列pm.product_descriptions
与国家字符集字符串进行比较:Run Code Online (Sandbox Code Playgroud)SELECT translated_description FROM product_descriptions WHERE translated_name = N'LCD Monitor 11/PM';
U''
用于处理Oracle调用接口(OCI)中的SQL NCHAR字符串文字
基于此Oracle文档使用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
.您也可以通过编程方式使用实现这一行为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_STATEMENT
从OCI
语句句柄检索SQL文本,则SQL文本将返回U'
而不是N'
原始文本中指定的.
从数据类型的角度来看,提供的两个查询之间没有区别
使用时N'
我们表示给定的数据类型是NCHAR
或NVARCHAR
.
U'
用于表示unicode
N'string'
只是返回string
as NCHAR
类型。
U'string'
还返回NCHAR
type,但是它对进行额外的处理string
:用Unicode代码点替换\\
,\
并用Unicode代码点代替,这里有4个十六进制数字。这类似于,区别在于后者返回。\xxxx
U+xxxx
xxxx
UNISTR('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)