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 行记录)
posted @ 2024-04-03 17:01  KINGBASE研究院  阅读(395)  评论(0编辑  收藏  举报