这些查询的含义和区别是什么?
SELECT U'String' FROM dual;
以及
SELECT N'String' FROM dual;
nfs0ujit1#
N''用于将字符串转换为NCHAR或NVARCHAR2数据类型
N''
NCHAR
NVARCHAR2
根据此Oracle文档Oracle -文字
文本常量的语法如下所示:
其中N或n指定使用国家字符集的文字(NCHAR或NVARCHAR2数据)。
N
n
在第二篇文章中还介绍了Oracle -数据类型
N'String'用于将字符串转换为NCHAR数据类型来自上面列出的文章:以下示例将pm.product_descriptions表的translated_description列与国家字符集字符串进行比较:
N'String'
pm.product_descriptions
translated_description
SELECT translated_description FROM product_descriptions WHERE translated_name = N'LCD Monitor 11/PM';
U''用于处理Oracle调用接口(OCI)中的SQL NCHAR字符串文字
U''
基于此Oracle文档Programming with UnicodeOracle调用接口(OCI)是其余客户端数据库访问产品使用的最低级别API。它为C/C++程序访问存储在SQL CHAR和NCHAR数据类型中的Unicode数据提供了一种灵活的方法。使用OCI,可以通过编程方式指定字符集(UTF-8、UTF-16等),用于插入或检索数据。它通过Oracle Net访问数据库。
CHAR
OCI是用于访问数据库的最低级API,因此它提供了最佳的性能。
您可以通过将环境变量ORA_NCHAR_LITERAL_REPLACE设置为TRUE来启用它。您还可以通过在OCIEnvCreate()和OCIEnvNlsCreate()中使用OCI_NCHAR_LITERAL_REPLACE_ON和OCI_NCHAR_LITERAL_REPLACE_OFF模式以编程方式实现此行为。因此,例如,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)启用NCHAR文字替换,而OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)将其关闭。[...]请注意,当NCHAR文字替换打开时,OCIStmtPrepare和OCIStmtPrepare2将用SQL文本中的U'文字转换N'文字,并将生成的SQL文本存储在语句句柄中。因此,如果应用程序使用OCI_ATTR_STATEMENT从OCI语句句柄检索SQL文本,SQL文本将返回U',而不是原始文本中指定的N'。
ORA_NCHAR_LITERAL_REPLACE
TRUE
OCIEnvCreate()
OCIEnvNlsCreate()
OCI_NCHAR_LITERAL_REPLACE_ON
OCI_NCHAR_LITERAL_REPLACE_OFF
OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)
OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)
OCIStmtPrepare
OCIStmtPrepare2
U'
N'
OCI_ATTR_STATEMENT
OCI
从数据类型的Angular 来看,所提供的两种查询没有区别
rqdpfwrv2#
N'*string*'
*string*
U'*string*'
\\
\
\*xxxx*
U+*xxxx*
*xxxx*
UNISTR('*string*')
当您希望Unicode字符串独立于编码和NLS设置时,U'文本非常有用。示例:
select n'\€', u'\\\20ac', n'\\\20ac' from dual; N'\€' U'\\\20AC' N'\\\20AC' ----- ---------- ---------- \€ \€ \\\20ac
67up9zun3#
当使用N'时,我们表示给定的数据类型是NCHAR或NVARCHAR。U'用于表示Unicode
NVARCHAR
lsmd5eda4#
所记录的N''文字与标准字符文字相同(''),只是它们的数据类型是NVARCHAR 2而不是VARCHAR 2。请务必注意,这些文字中的字符以及整个SQL语句从客户端字符集转换为数据库字符集。数据库字符集不支持的文本中的所有字符都将丢失。未记录的U''文本的数据类型也是NVARCHAR 2。U''文本的内容解释方式与SQL UNISTR函数的输入类似。即,每个字符序列\xxxx(其中每个x是一个十六进制数字)被解释为UTF-16代码点U+xxxx。我不确定为什么U''文字没有文档记录。我只能猜测。它们由NCHAR文字替换功能在内部使用,当在客户机上启用该功能时,会自动将N''文本转换为U''文本。这样可以防止由于字符集转换而丢失上述数据,并且即使数据库字符集不是Unicode,也可以为NVARCHAR 2列提供文本Unicode数据。这个线程的问题中的两个查询通常是不等价的,因为文字文本将被不同地解释。但是,如果文字中没有反斜杠,则观察不到任何差异。
''
UNISTR
\xxxx
x
4条答案
按热度按时间nfs0ujit1#
(1)N“”文本型
N''
用于将字符串转换为NCHAR
或NVARCHAR2
数据类型根据此Oracle文档Oracle -文字
文本常量的语法如下所示:
其中
N
或n
指定使用国家字符集的文字(NCHAR
或NVARCHAR2
数据)。在第二篇文章中还介绍了Oracle -数据类型
N'String'
用于将字符串转换为NCHAR
数据类型来自上面列出的文章:
以下示例将
pm.product_descriptions
表的translated_description
列与国家字符集字符串进行比较:(2)U“"字面值
U''
用于处理Oracle调用接口(OCI)中的SQL NCHAR字符串文字基于此Oracle文档Programming with 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
来启用它。您还可以通过在OCIEnvCreate()
和OCIEnvNlsCreate()
中使用OCI_NCHAR_LITERAL_REPLACE_ON
和OCI_NCHAR_LITERAL_REPLACE_OFF
模式以编程方式实现此行为。因此,例如,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)
启用NCHAR
文字替换,而OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)
将其关闭。[...]请注意,当
NCHAR
文字替换打开时,OCIStmtPrepare
和OCIStmtPrepare2
将用SQL文本中的U'
文字转换N'
文字,并将生成的SQL文本存储在语句句柄中。因此,如果应用程序使用OCI_ATTR_STATEMENT
从OCI
语句句柄检索SQL文本,SQL文本将返回U'
,而不是原始文本中指定的N'
。(3)回答您的问题
从数据类型的Angular 来看,所提供的两种查询没有区别
rqdpfwrv2#
N'*string*'
只是将*string*
返回为NCHAR
类型。U'*string*'
也返回NCHAR
类型,但是它会对*string*
执行附加处理:将\\
替换为\
,将\*xxxx*
替换为Unicode码位U+*xxxx*
,其中*xxxx*
为4位十六进制数字,类似于UNISTR('*string*')
,不同之处在于后者返回NVARCHAR2
。当您希望Unicode字符串独立于编码和NLS设置时,
U'
文本非常有用。示例:
67up9zun3#
当使用
N'
时,我们表示给定的数据类型是NCHAR
或NVARCHAR
。U'
用于表示Unicodelsmd5eda4#
所记录的
N''
文字与标准字符文字相同(''
),只是它们的数据类型是NVARCHAR 2而不是VARCHAR 2。请务必注意,这些文字中的字符以及整个SQL语句从客户端字符集转换为数据库字符集。数据库字符集不支持的文本中的所有字符都将丢失。未记录的
U''
文本的数据类型也是NVARCHAR 2。U''
文本的内容解释方式与SQLUNISTR
函数的输入类似。即,每个字符序列\xxxx
(其中每个x
是一个十六进制数字)被解释为UTF-16代码点U+xxxx。我不确定为什么U''
文字没有文档记录。我只能猜测。它们由NCHAR文字替换功能在内部使用,当在客户机上启用该功能时,会自动将N''
文本转换为U''
文本。这样可以防止由于字符集转换而丢失上述数据,并且即使数据库字符集不是Unicode,也可以为NVARCHAR 2列提供文本Unicode数据。这个线程的问题中的两个查询通常是不等价的,因为文字文本将被不同地解释。但是,如果文字中没有反斜杠,则观察不到任何差异。