MySQL兼容性参数
lower_case_column_names
参数说明: 该参数涉及的功能如下所示:
控制数据库返回字段名的大小写敏感性。
控制SELECT LIST中对于引用的别名的大小写敏感性。当该参数设置为0时,SELECT LIST中对于引用的别名也是大小写敏感的,设置为1时则不敏感。
- 在Vastbase数据库中,
SELECT LIST
中的别名大小写敏感性仅由lower_case_column_names参数决定,与lower_case_table_names参数无关。当lower_case_column_names设置为0时,无论lower_case_table_names如何配置,SELECT LIST
中对别名的引用都将保持大小写敏感性。- COLUMN别名的大小写敏感性仅在
SELECT LIST
部分有效。在其他情况下,如WHERE
条件或GROUP BY
语句中,使用COLUMN的别名以及其他数据库对象的别名时,设置该参数不会生效,大小写均不敏感。- 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 0,1
0:开启大小写敏感。
1:关闭大小写敏感。
默认值: 0
示例:
示例1: 控制表别名大小写敏感性。
1、修改数据库配置文件”postgresql.conf”中”lower_case_column_names”参数(0表示开启,1表示关闭,默认为0开启)。
lower_case_column_names=0
2、重启数据库实例。
3、创建测试表并插入数据。
create table test(id int,Home varchar);
insert into test values(1,2),(3,4);
4、查询数据库中字段名称。
select * from test;
结果返回如下,返回字段名中的大小写与建表时的写法相同:
id | Home
----+------
1 | 2
3 | 4
(2 rows)
示例2: 控制SELECT LIST中对于引用的别名的大小写敏感。
1、修改数据库配置文件”postgresql.conf”中”lower_case_column_names”参数(0表示开启,1表示关闭,默认为0开启)。
lower_case_column_names=0
2、重启数据库实例。
3、创建测试表并插入数据。
create table tab1 (id int, amount int);
insert into tab1 values(1,100),(2,200),(3,150),(4,50);
4、select语句查询时别名大小写敏感。
select id ID, amount Amount from tab1;
select Id, Amount from tab1;
select tab1.Id, tab1.Amount from tab1;
返回结果如下:
ID | Amount
----+------
1 | 100
2 | 200
3 | 150
4 | 50
(4 rows)
Id | Amount
----+------
1 | 100
2 | 200
3 | 150
4 | 50
(4 rows)
Id | Amount
----+------
1 | 100
2 | 200
3 | 150
4 | 50
(4 rows)
vastbase_sql_mode
参数说明: Vastbase在MySQL兼容模式下,支持使用GUC参数vastbase_sql_mode控制B兼容下的语法校验规则。
- 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
- 仅在MySQL兼容模式下校验此参数。在其他兼容模式下修改此参数值并不会报错,但修改不会生效。
- 若将此参数取值设为空字符串,则表示不启用任何相关特性。
- 参数值由若干个配置项用逗号隔开构成,例如:
set vastbase_sql_mode='only_full_group_by,sql_mode_strict';
。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 字符串,仅允许合法字符串设定。参数值由若干个配置项用逗号隔开构成。
vastbase_sql_mode取值范围:
取值 | 说明 | 用法参考 |
---|---|---|
ONLY_FULL_GROUP_BY | 应用于下列两种场景:
|
SELECT |
ANSI_QUOTES | 主要是针对出现在各种需要使用双引号表示字符串值的地方。
|
双引号解释为标识符 |
SQL_MODE_STRICT | 在为字段设置UNSIGNED属性后,限制插入的列值正负和长度。涉及的类型有tinyint、smallint、int、integer、bigint、mediumint。 | COLUMN定义支持ZEROFILL-UNSIGNED属性 |
pipes_as_concat | 控制|| 被当成连接符还是或操作符。
|| 被当成连接符。|| 被当成操作符。 |
参考示例1。 |
pad_char_to_full_length | 控制char类型查询时是否删除尾部空格。
|
参考示例2。 |
no_zero_date | 控制 '0000-00-00' 是否为合法日期,支持DATE、DATETIME类型。取值及表现如下所示:
|
参考示例3。 |
error_for_division_by_zero | 控制除数为0时是否报错(包含 /, mod, div等除法含义的操作符)。取值及表现如下所示:
|
参考示例4。 |
默认值: ONLY_FULL_GROUP_BY,ANSI_QUOTES,pipes_as_concat,pad_char_to_full_length,sql_mode_strict,no_zero_date
示例
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)
示例4: error_for_division_by_zero选项效果展示。
1、设置GUC参数vastbase_sql_mode = 'error_for_division_by_zero'
,并查询结果。
set vastbase_sql_mode = 'error_for_division_by_zero';
show vastbase_sql_mode;
返回结果为:
vastbase_sql_mode
----------------------------
error_for_division_by_zero
(1 row)
2、执行一个除以零的查询。
SELECT 10 / 0;
返回结果如下,除数为0时告警:
WARNING: division by zero
?column?
----------
(1 row)
3、设置GUC参数vastbase_sql_mode = ''
,并查询结果。
set vastbase_sql_mode = '';
show vastbase_sql_mode;
返回结果为:
vastbase_sql_mode
-------------------
(1 row)
4、再次执行一个除以零的查询。
SELECT 10 / 0;
返回结果如下,除数为0时无告警无报错:
?column?
----------
(1 row)