Oracle中N'String'与U'String'文字之间的差异

xqkwcwgp  于 2022-12-18  发布在  Oracle
关注(0)|答案(4)|浏览(170)

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

SELECT U'String' FROM dual;

以及

SELECT N'String' FROM dual;
nfs0ujit

nfs0ujit1#

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

(1)N“”文本型

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

根据此Oracle文档Oracle -文字

文本常量的语法如下所示:

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

在第二篇文章中还介绍了Oracle -数据类型

N'String'用于将字符串转换为NCHAR数据类型
来自上面列出的文章:
以下示例将pm.product_descriptions表的translated_description列与国家字符集字符串进行比较:

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

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

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

您可以通过将环境变量ORA_NCHAR_LITERAL_REPLACE设置为TRUE来启用它。您还可以通过在OCIEnvCreate()OCIEnvNlsCreate()中使用OCI_NCHAR_LITERAL_REPLACE_ONOCI_NCHAR_LITERAL_REPLACE_OFF模式以编程方式实现此行为。因此,例如,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)启用NCHAR文字替换,而OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)将其关闭。
[...]请注意,当NCHAR文字替换打开时,OCIStmtPrepareOCIStmtPrepare2将用SQL文本中的U'文字转换N'文字,并将生成的SQL文本存储在语句句柄中。因此,如果应用程序使用OCI_ATTR_STATEMENTOCI语句句柄检索SQL文本,SQL文本将返回U',而不是原始文本中指定的N'

(3)回答您的问题

从数据类型的Angular 来看,所提供的两种查询没有区别

rqdpfwrv

rqdpfwrv2#

  • N'*string*'只是将*string*返回为NCHAR类型。
  • U'*string*'也返回NCHAR类型,但是它会对*string*执行附加处理:将\\替换为\,将\*xxxx*替换为Unicode码位U+*xxxx*,其中*xxxx*为4位十六进制数字,类似于UNISTR('*string*'),不同之处在于后者返回NVARCHAR2

当您希望Unicode字符串独立于编码和NLS设置时,U'文本非常有用。
示例:

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

N'\€' U'\\\20AC' N'\\\20AC'
----- ---------- ----------
\€    \€         \\\20ac
67up9zun

67up9zun3#

当使用N'时,我们表示给定的数据类型是NCHARNVARCHAR
U'用于表示Unicode

lsmd5eda

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数据。
这个线程的问题中的两个查询通常是等价的,因为文字文本将被不同地解释。但是,如果文字中没有反斜杠,则观察不到任何差异。

相关问题