1.Oracle的本地字符串和Q界定字符串

用N或n指定的字符串使用NCHAR或NVARCHAR2字符集。默认情况下,使用此表示法输入的文本,通过数据库字符集转化为本地字符集。为了避免字符串转换成数据库字符时丢失数据,需将环境变量ORA_NCHAR_LITERAL_REPLACE 设为TRUE,这样可以替换并保留字符串内容,以供SQL处理。
在语法的顶部分支:
c是用户字符集的任何成员。文本中的单引号(’)前必须有转义字符。若要在文本中表示一个单引号,需输入两个单引号。
'和’是两个单一的引号,用于开始和结束的文本。
在语法的底部分支:
Q或q表示将使用替代引用机制。该机制允许对文本字符串使用各种分隔符。
最外面是在开始quote_delimiter之前的单引号和结束quote_delimiter之后的单引号。
c是用户字符集的任何成员。可以在由字符组成的文本中包含双引号("),还可以包含quote_delimit,只要不立即跟着一个单引号就行。
quote_delimit是除空格、制表符和回车符之外的任何单字节或多字节字符。quote_delimit可以是单引号。但是,如果quote_delimit出现在文本字符串中,需确保它后面没有紧跟单引号。
如果开始的quote_delimit是[{<(之一,那么结束的quote_delimit必须是对应的]}>)。在所有其他情况下,开始和结束quote_delimit必须是相同的字符。
SQL> create table test1 as select '123' a from dual;
Table created.
SQL> describe test1;
Name Null? Type
----------------------------------------- -------- ----------------------------
A CHAR(3)
SQL> create table test2 as select N'123' a from dual;
Table created.
SQL> describe test2;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NCHAR(3)
SQL> select N'[12'3]' from dual;
ERROR:
ORA-01756: quoted string not properly terminated
SQL> select n'[12''3]' from dual;
N'[12''3]'
------------------------
[12'3]
Oracle支持本地字符串,本地字符串被存为了NCHAR类型。字符串中,需要用连续的2个单引号来代表1个单引号。
SQL> select Q'ï123"ï' from dual;
Q'Ï1
----
123"
SQL> select q'[123']' from dual;
Q'[1
----
123'
SQL> select Q'[123'']' from dual;
Q'[12
-----
123''
SQL> select Q'[123]]' from dual;
Q'[1
----
123]
SQL> select q'[aa'a[' from dual;
ERROR:
ORA-01756: quoted string not properly terminated
SQL> select Q'[(('}{'<>]' from dual;
Q'[(('}{
--------
(('}{'<>
SQL> create table test2 as select Nq'[12''3]' a from dual;
Table created.
SQL>
SQL> describe test2;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NCHAR(5)
SQL> select * from test2;
A
--------------------
12''3
Oracle支持Q界定字符串,字符串中可包括除空格、制表符和回车符之外的任何字符,如双引号、单引号、quote_delimit等。
Oracle支持NQ、nQ、Nq、nq的组合使用。
quote_delimit如果是以[{<(开始,则必须以]}>)结束,其他情况时,quote_delimit可以是除空格、制表符和回车符之外的任何字符。
2.KES的本地字符串和Q界定字符串
test=# create table test1 as select '123' a;
SELECT 1
test=# \d test1;
Table "public.test1"
Column | Type | Collation | Nullable | Default
--------+------+-----------+----------+---------
a | text | | |
test=# create table test2 as select N'123' a;
SELECT 1
test=# \d test2;
Table "public.test2"
Column | Type | Collation | Nullable | Default
--------+--------+-----------+----------+---------
a | bpchar | | |
test=# select n'[12'3]';
test'#
test=# select n'[12''3]';
bpchar
--------
[12'3]
(1 row)
KES V9R1支持本地字符串,用N或n指定的字符串使用bpchar字符集。
test=# select q'[123']';
test'# ^C
KES V9R1不支持Q-quote文本中包括奇数个单引号。
test=# select Q'[123'']';
?column?
----------
123''
(1 row)
test=# select Q'[''12]';
ERROR: unterminated q' literal at or near "Q'['"
LINE 1: select Q'[''12]';
KES V9R1支持Q-quote文本中包括偶数个单引号。但如果文本中的单引号紧挨着 在起始quote_delimit之后时,报error。
test=# select nq'[123]';
?column?
----------
123
(1 row)
test=# select nQ'[123]';
ERROR: type "nq" does not exist
LINE 1: select nQ'[123]';
^
test=# select NQ'[123]';
ERROR: type "nq" does not exist
LINE 1: select NQ'[123]';
^
test=# select Nq'[123]';
ERROR: type "nq" does not exist
LINE 1: select Nq'[123]';
KES V9R1只支持nq,不支持Nq NQ Nq
3.差异分析
KES V9R1已有功能:
- 用Q或者q表示是界定字符串,运行字符串中使用各种分隔符。
quote_delimit是除空格、制表符和回车符之外的任何单字节或多字节字符。quote_delimit可以是单引号。但是,如果quote_delimit出现在文本字符串中,需确保它后面没有紧跟单引号。 - 如果开始的quote_delimit是[{<(之一,那么结束的quote_delimit必须是对应的]}>)。在所有其他情况下,开始和结束quote_delimit必须是相同的字符。
- 支持nq组合
KES V9R1需新增的功能:
- quote_delimit之间的文本可以是用户字符集中除空格、制表符和回车符之外的任何字符,包括单引号、双引号、quote_delimit(后边不能紧跟单引号)、特殊字符等。
- 支持NQ、Nq、nQ组合使用。




