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

磐维数据库_转义字符相关参数说明与测试

原创 磐维数据库 2024-10-31
383

测试环境

  • (PanWeiDB_V2.0-S3.0.1_B01) compiled at 2024-09-29 19:47:53 commit d086caf
  • B 模式

相关参数

  • b_format_behavior_compat_options 的 b_format_escape 选项;
  • standard_conforming_strings(名词解释:符合 SQL 标准的 string)

背景

很多客户存在插入 \n 字符的需求,不希望插入后被转义,变成换行符。

相关概念

  • string literal:字符串常量;
  • escape string constant:转义字符串语法(E’…’)

测试用例

-- show b_format_behavior_compat_options; -- show standard_conforming_strings; CREATE TABLE backslash_test ( id integer, name text ); -- string literal INSERT INTO backslash_test VALUES (1, 'aaa\nbbb'); INSERT INTO backslash_test VALUES (2, 'aaa\cbbb'); INSERT INTO backslash_test VALUES (3, 'aaa\\nbbb'); INSERT INTO backslash_test VALUES (4, 'aaa\\cbbb'); -- escape string constant INSERT INTO backslash_test VALUES (11, E'aaa\nbbb'); INSERT INTO backslash_test VALUES (12, E'aaa\cbbb'); INSERT INTO backslash_test VALUES (13, E'aaa\\nbbb'); INSERT INTO backslash_test VALUES (14, E'aaa\\cbbb'); SELECT * FROM backslash_test;

三种模式

在三种模式中,使用 escape string constant ,出现 \ 都会进行转义,如果想插入 \n 字符,需要双写,也就是使用 E’aaa\\nbbb’ 的形式。

b_format_escape 选项,仅在 mysql 兼容模式有效,且开启时,覆盖 standard_conforming_strings 的值;在其他兼容模式,可忽略该选项。

1. b_format_escape 开启(与 mysql 默认行为相同)

行为

  • 在 string literal 中,出现 \ 会进行转义;
  • 如果要插入 \n 字符,需要双写 \;

测试

zc_test=# show b_format_behavior_compat_options;
    b_format_behavior_compat_options     
-----------------------------------------
 set_keyword_as_colname, b_format_escape
(1 row)
zc_test=# SELECT * FROM backslash_test;
 id |   name   
----+----------
  1 | aaa     +
    | bbb
  2 | aaacbbb
  3 | aaa\nbbb
  4 | aaa\cbbb
 11 | aaa     +
    | bbb
 12 | aaacbbb
 13 | aaa\nbbb
 14 | aaa\cbbb
(8 rows)

2. b_format_escape 关闭,standard_conforming_strings 开启(与 postgreSQL 默认行为相同)

行为

  • 在 string literal 中,\ 相当于正常字符,不会做任何处理;
  • 如果想插入 \n 字符,单写 \ 即可。
  • 如果想转义,需要使用 escape string constant;

测试

gs_guc reload -N all -I all -c "b_format_behavior_compat_options='set_keyword_as_colname'"
zc_test=# show b_format_behavior_compat_options;
 b_format_behavior_compat_options 
----------------------------------
 set_keyword_as_colname
(1 row)

zc_test=# show standard_conforming_strings;
 standard_conforming_strings 
-----------------------------
 on
(1 row)
zc_test=# SELECT * FROM backslash_test;
 id |   name    
----+-----------
  1 | aaa\nbbb
  2 | aaa\cbbb
  3 | aaa\\nbbb
  4 | aaa\\cbbb
 11 | aaa      +
    | bbb
 12 | aaacbbb
 13 | aaa\nbbb
 14 | aaa\cbbb
(8 rows)

3. b_format_escape 关闭,standard_conforming_strings 关闭

行为

  • 在 string literal 中存在 \ ,会有warning,但可以执行 insert,进行了转义;
  • 如果要插入 \n 字符,需要双写 \;
  • 在这种模式下建议使用 escape string constant。

测试

gs_guc reload -N all -I all -c "standard_conforming_strings='off'"
zc_test=# show b_format_behavior_compat_options;
 b_format_behavior_compat_options 
----------------------------------
 set_keyword_as_colname
(1 row)

zc_test=# show standard_conforming_strings;
 standard_conforming_strings 
-----------------------------
 off
(1 row)
...
zc_test=# INSERT INTO backslash_test
zc_test-# VALUES (2, 'aaa\cbbb');
WARNING:  nonstandard use of escape in a string literal
LINE 2: VALUES (2, 'aaa\cbbb');
                   ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT 0 1


zc_test=# INSERT INTO backslash_test
zc_test-# VALUES (3, 'aaa\\nbbb');
WARNING:  nonstandard use of \\ in a string literal
LINE 2: VALUES (3, 'aaa\\nbbb');
                   ^
HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
INSERT 0 1
...

zc_test=# INSERT INTO backslash_test
zc_test-# VALUES (11, E'aaa\nbbb');
INSERT 0 1
...
zc_test=# SELECT * FROM backslash_test;
 id |   name   
----+----------
  1 | aaa     +
    | bbb
  2 | aaacbbb
  3 | aaa\nbbb
  4 | aaa\cbbb
 11 | aaa     +
    | bbb
 12 | aaacbbb
 13 | aaa\nbbb
 14 | aaa\cbbb
(8 rows)

总结

本文介绍了在磐维数据库中,与转义字符相关的两个参数:b_format_escape 和 standard_conforming_strings。在 B 模式中,两个参数共同决定数据库在处理转义字符时的行为,在 A 和 PG 模式,仅需关注 standard_conforming_strings 参数。

建议根据业务实际情况以及兼容模式,选择上面介绍的模式 1 或 2。如果需要插入 \n 字符:

  • 在模式 1 中,应使用 ‘aaa\\nbbb’ 或 E’aaa\\nbbb’ 的形式;
  • 在模式 2 中,应使用 ‘aaa\nbbb’ 或 E’aaa\\nbbb’ 的形式;
  • 在模式 3 中,建议使用 E’aaa\\nbbb’ 的形式。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论