VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

COLUMN定义支持ZEROFILL/UNSIGNED属性

功能描述

Vastbase在MySQL兼容模式下:

  • 支持对字段定义ZEROFILL属性(仅为语法兼容,实际功能与UNSIGNED属性一致)。

  • 支持对字段定义UNSIGNED属性,仅能插入正数,若插入负数则报错,不允许插入。

    • 若设置参数vastbase_sql_mode的取值中包含sql_mode_strict,则可以限制插入的列值正负和长度。

    • 若设置参数vastbase_sql_mode的取值中不包含sql_mode_strict,则插入超过所设置数据类型取值范围时不会报错,仅警告提示,并对负数插入0,正数大于最大值时插入最大值。

在设置UNSIGNED属性后,针对不同数据类型取值宽度不变,范围发生变化。支持的数据类型及范围变化如下表所示:

数据类型 SIGNED范围 UNSIGNED范围
TINYINT(M) -128~127 0~255
SMALLINT(M) -32768~32767 0~65535
MEDIUMINT(M) -8388608~8388607 0~16777215
INT(M) -2147483648~2147483647 0~4294967295
INTEGER(M) -2147483648~2147483647 0~4294967295
BIGINT(M) -9223372036854775808~9223372036854775807 0~18446744073709551615

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。

  • 不支持在ustore表和列存表中使用UNSIGNED属性。

  • 支持情况:

    • 仅V2.2 Build 10(Patch No.9)及以上补丁版本支持UNSIGNED属性。

    • 仅V2.2 Build 10(Patch No.10)及以上补丁版本支持ZEROFILL属性。

示例

示例1 column对字段定义为UNSIGNED属性。

1、设置vastbase_sql_mode参数值为sql_mode_strict,创建测试表,使用unsigned属性定义tinyint类型。

从V2.2 Build 10(Patch No.9)开始,参数vastbase_sql_mode同时控制了B模式下的多种SQL校验规则,如下示例操作仅设置会话级别的参数,若需设置实例级别的参数,请注意参数不同取值对各功能的影响。

SET vastbase_sql_mode='sql_mode_strict';
CREATE TABLE stest(id tinyint unsigned);

2、验证插入负数。

INSERT INTO stest VALUES(-1);

结果返回如下:

ERROR:  tinyint unsigned out of range
CONTEXT:  referenced column: id

3、验证插入超过tinyint取值范围的值256。

INSERT INTO stest VALUES(256);

结果返回如下:

ERROR:  tinyint unsigned out of range
CONTEXT:  referenced column: id

4、验证插入tinyint取值范围内的值255。

INSERT INTO stest VALUES(255);

5、查询表中数据。

SELECT * FROM stest;

结果返回如下:

 id
-----
 255
(1 row)

示例2 COLUMN对字段定义为ZEROFILL属性。

1、设置vastbase_sql_mode参数值为''

从V2.2 Build 10(Patch No.9)开始,参数vastbase_sql_mode同时控制了B模式下的多种SQL校验规则,如下示例操作仅设置会话级别的参数,若需设置实例级别的参数,请注意参数不同取值对各功能的影响。

SET vastbase_sql_mode='';

2、创建分区表。

create table tb_1152248
(
a1 int zerofill,
a2 integer zerofill unique,
a3 tinyint zerofill default 4,
a4 smallint zerofill not null,
a5 bigint zerofill)
partition by range(a1)
(
partition p1 values less than(5000),
partition p2 values less than(10000),
partition p3 values less than(maxvalue));

3、插入数据并查看。

insert into tb_1152248 values (-1,-2,-3,-4,-5);
insert into tb_1152248 values (0,3,3,4,1);
insert into tb_1152248 values (2,2,3,4),(3,4,5,6);

第一句插入语句插入超过所设置数据类型取值范围,出现如下警告提示:

WARNING:  int unsigned out of range
CONTEXT:  referenced column: a1
WARNING:  int unsigned out of range
CONTEXT:  referenced column: a2
WARNING:  tinyint unsigned out of range
CONTEXT:  referenced column: a3
WARNING:  smallint unsigned out of range
CONTEXT:  referenced column: a4
WARNING:  bigint unsigned out of range
CONTEXT:  referenced column: a5

若vastbase_sql_mode的取值中包含sql_mode_strict时,会限制限制插入的列值正负,所以第一条插入将执行失败,报错信息如下:

ERROR:  int unsigned out of range
CONTEXT:  referenced column: a1

测试表中数据查询结果为如下:

 a1 | a2 | a3 | a4 | a5
----+----+----+----+----
 0  | 3  | 3  | 4  | 1
 2  | 2  | 3  | 4  |
 3  | 4  | 5  | 6  |
(3 rows)

4、查询测试表中数据。

select * from tb_1152248 order by 1,2;

查询结果为如下,对负数则插入0,位置空缺处不填充0(ZEROFILL仅做语法兼容):

 a1 | a2 | a3 | a4 | a5
----+----+----+----+----
 0  | 0  | 0  | 0  | 0
 0  | 3  | 3  | 4  | 1
 2  | 2  | 3  | 4  |
 3  | 4  | 5  | 6  |
(4 rows)