KingbaseES 兼容 MySQL 数据库参数sql_mode配置
KingbaseES数据库,已经对Mysql数据库进行了功能和使用方面的兼容。针对sql_mode配置使用情况,也做了相关的兼容适配,在最新kes的mysql数据库模式中,sql_mode参数已经对ONLY_FULL_GROUP_BY,ANSI_QUOTES,STRICT_ALL_TABLES这三个参数的使用,进行了语法和功能上的兼容。
下面介绍KingbaseES中对上述三个配置项的使用。
-- 测试数据:
test=# create table demo(id int ,na varchar(10));
CREATE TABLE
test=# insert into demo values(1 , 'a'),(2, 'b');
INSERT 0 2
1. sql_mode参数ONLY_FULL_GROUP_BY使用
sql_mode默认未配置ONLY_FULL_GROUP_BY时,会采用非严格的查询分组功能验证,不会要求select、having或order by后面存在的非聚合列必须全部在group by中存在:
test=# show sql_mode ;
sql_mode
----------
""
(1 行记录)
test=# select id ,na ,count(1) from demo group by id ;
id | na | count
----+----+-------
2 | b | 1
1 | a | 1
(2 行记录)
sql_mode配置ONLY_FULL_GROUP_BY时,会采用严格的查询分组功能验证,会要求select、having或order by后面存在的非聚合列必须全部在group by中存在:
test=# set sql_mode = ONLY_FULL_GROUP_BY;
SET
test=# select id ,na ,count(1) from demo group by id ;
ERROR: 字段 "demo.na" 必须出现在 GROUP BY 子句中或者在聚合函数中使用
第1行select id ,na ,count(1) from demo group by id ;
2. sql_mode参数ANSI_QUOTES使用
sql_mode默认未配置ANSI_QUOTES时,双引号只做为常亮引用标识:
test=# show sql_mode ;
sql_mode
----------
""
(1 行记录)
test=# select * from demo ;
id | na
----+----
1 | a
2 | b
(2 行记录)
test=# select * from demo where na = "a";
id | na
----+----
1 | a
(1 行记录)
test=# select * from "demo";
ERROR: 语法错误 在 ""demo"" 或附近的
第1行select * from "demo";
sql_mode配置ANSI_QUOTES时,双引号做为字段和表名标识引用:
test=# show sql_mode ;
sql_mode
-------------
ANSI_QUOTES
(1 行记录)
test=# select * from demo where na = "a";
ERROR: 字段 "a" 不存在
第1行select * from demo where na = "a";
^
test=# select * from "demo";
id | na
----+----
1 | a
2 | b
(2 行记录)
test=# select "id" from demo;
id
----
1
2
(2 行记录)
3. sql_mode参数STRICT_ALL_TABLES使用
sql_mode默认未配置STRICT_ALL_TABLES时,数据校验为非严格模式:
test=# show sql_mode ;
sql_mode
----------
""
(1 行记录)
test=# select * from demo ;
id | na
----+----
1 | a
2 | b
(2 行记录)
test=# insert into demo values(3 , '12345678901') ;
WARNING: value too long for type character varying(10)
INSERT 0 1
test=# select * from demo ;
id | na
----+------------
1 | a
2 | b
3 | 1234567890
(3 行记录)
sql_mode默认配置STRICT_ALL_TABLES时,数据校验为严格模式:
test=# show sql_mode;
sql_mode
-------------------
STRICT_ALL_TABLES
(1 行记录)
test=# select * from demo ;
id | na
----+------------
1 | a
2 | b
3 | 1234567890
(3 行记录)
test=# insert into demo values(3 , 'abcdefghijk') ;
ERROR: value too long for type character varying(10)
test=# select * from demo ;
id | na
----+------------
1 | a
2 | b
3 | 1234567890
(3 行记录)
KINGBASE研究院