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)