vastbase_sql_mode
功能描述
Vastbase在MySQL兼容模式下,支持使用GUC参数vastbase_sql_mode控制B兼容下的语法校验规则。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
默认值
ONLY_FULL_GROUP_BY,ANSI_QUOTES,pipes_as_concat,pad_char_to_full_length
注意事项
- 该功能仅在数据库兼容模式为MySQL时支持(即数据库初始化时指定DBCOMPATIBILITY='B')。
- 仅在MySQL兼容模式下校验此参数。在其他兼容模式下修改此参数值并不会报错,但修改不会生效。
- 若将此参数取值设为空字符串,则表示不启用任何相关特性。
- 参数值由若干个配置项用逗号隔开构成,例如:
set vastbase_sql_mode='only_full_group_by,sql_mode_strict';
。
取值范围
字符串,仅允许合法字符串设定。参数值由若干个配置项用逗号隔开构成。
表1 vastbase_sql_mode取值范围
取值 | 说明 | 用法参考 |
---|---|---|
ONLY_FULL_GROUP_BY | 应用于下列两种场景:
|
SELECT |
ANSI_QUOTES | 主要是针对出现在各种需要使用双引号表示字符串值的地方。
|
双引号解释为标识符 |
SQL_MODE_STRICT | 在为字段设置UNSIGNED属性后,限制插入的列值正负和长度。涉及的类型有tinyint、smallint、int、integer、bigint、mediumint。 | COLUMN定义支持UNSIGNED属性 |
pipes_as_concat | 控制|| 被当成连接符还是或操作符。
|| 被当成连接符。|| 被当成操作符。 |
参考示例1。 |
pad_char_to_full_length | 控制char类型查询时是否删除尾部空格。
|
参考示例2。 |
no_zero_date | 控制 '0000-00-00' 是否为合法日期,支持DATE、DATETIME类型。取值及表现如下所示:
|
参考示例3。 |
示例
1、创建测试表。
create table test1(a int,b int);
2、设置GUC参数vastbase_sql_mode = ''
。
SET vastbase_sql_mode='';
3、向表中插入数据。
insert into test1 values(1||2,2);
4、查询test1表数据。
select * from test1;
返回结果为:
a | b
---+---
1 | 2
(1 row)
5、设置GUC参数vastbase_sql_mode = 'pipes_as_concat'
,并查询结果。
set vastbase_sql_mode = 'pipes_as_concat';
show vastbase_sql_mode;
返回结果为:
vastbase_sql_mode
-------------------
pipes_as_concat
(1 row)
6、向表中插入数据。
insert into test1 values(1||2,2);
7、查询test1表数据。
select * from test1;
如下所示,由于vastbase_sql_mode参数包含pipes_as_concat选项,因此||
的功能从或运算改为字符串拼接:
a | b
----+---
1 | 2
12 | 2
(2 rows)
示例2: pad_char_to_full_length选项效果展示。
1、创建测试表。
create table t1(x char(5),y varchar(5));
2、向表格中插入数据(char存储5个字符,而varchar存储4个字符)。
insert into t1 values('数据库 ','数据库 ');
3、设置GUC参数vastbase_sql_mode = ''
。
SET vastbase_sql_mode='';
4、查询表中存储数据的长度。
select x,char_length(x),y,char_length(y) from t1;
如下所示,char类型数据会把尾部空格删除,而varchar不会:
x | char_length | y | char_length
----------+-------------+---------+-------------
数据库 | 3 | 数据库 | 4
(1 row)
5、设置GUC参数vastbase_sql_mode = 'pad_char_to_full_length'
,并查询结果。
set vastbase_sql_mode = 'pad_char_to_full_length';
show vastbase_sql_mode;
返回结果为:
vastbase_sql_mode
-------------------------
pad_char_to_full_length
(1 row)
6、再次查询表中存储数据的长度。
select x,char_length(x),y,char_length(y) from t1;
如下所示,由于vastbase_sql_mode参数包含pad_char_to_full_length选项,因此char类型数据尾部空格不会被自动删除:
x | char_length | y | char_length
----------+-------------+---------+-------------
数据库 | 5 | 数据库 | 4
(1 row)
1、设置GUC参数vastbase_sql_mode = 'no_zero_date'
,并查询结果。
set vastbase_sql_mode = 'no_zero_date';
show vastbase_sql_mode;
返回结果为:
vastbase_sql_mode
-------------------
no_zero_date
(1 row)
2、创建测试表。
CREATE TABLE my_table_1160646 (
id INT AUTO_INCREMENT PRIMARY KEY,
date_column DATE
);
3、插入数据。
INSERT INTO my_table_1160646 (date_column) VALUES ('2022-01-01');
INSERT INTO my_table_1160646 (date_column) VALUES ('0000-00-00');
由于设置了vastbase_sql_mode = 'no_zero_date'
,因此'0000-00-00'为非法日期,插入成功但发出告警,返回结果如下:
INSERT 0 1
WARNING: date/time field value out of range: "0000-00-00"
LINE 1: ...NSERT INTO my_table_1160646 (date_column) VALUES ('0000-00-0...
^
CONTEXT: referenced column: date_column
INSERT 0 1
4、设置GUC参数vastbase_sql_mode = 'sql_mode_strict'
,并查询结果。
set vastbase_sql_mode = 'sql_mode_strict';
show vastbase_sql_mode;
返回结果为:
vastbase_sql_mode
-------------------
sql_mode_strict
(1 row)
5、再次插入日期'0000-00-00'。
INSERT INTO my_table_1160646 (date_column) VALUES ('0000-00-00');
插入成功,返回结果如下:
INSERT 0 1
6、查询表内容。
select * from my_table_1160646;
返回结果为:
id | date_column
----+-------------
1 | 2022-01-01
2 | 0000-00-00
3 | 0000-00-00
(3 rows)