测试环境
- (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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




