暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES 新特性 支持本地字符串和Q界定字符串

数据猿 2023-09-13
431

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

image.png

用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组合使用。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论