COLUMN定义支持ZEROFILL/UNSIGNED属性
功能描述
Vastbase在MySQL兼容模式下:
支持对字段定义ZEROFILL属性,用于修饰整型数据类型,当字段中写入值的长度小于定义长度时,会在数值前面用零补全。
支持填充ZEROFILL属性的类型如下所示,下表所示的数据类型均支持指定位数。
INT1 INT2 INT4 INT8 INT INTEGER SMALLINT MEDIUMINT BIGINT TINYINT NUMERIC DECIMAL 指定ZEROFILL属性的列,本质上是被映射成新的类型,这个类型在系统表中的记录为:
语法内容 对应类型 INT1/TINYINT ZEROFILL INT1ZF INT2/SMALLINT ZEROFILL INT2ZF INT4/INT/MEDIUMINT/INTEGER ZEROFILL INT4ZF INT8/BIGINT ZEROFILL INT8ZF 支持对字段定义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属性。
UNSIGNED属性支持情况:
V2.2 Build 10(Patch No.9)及以上补丁版本。
V2.2 Build 14及以上版本。
ZEROFILL属性支持情况:
V2.2 Build 10(Patch No.10)及以上补丁版本(仅为语法兼容)。
V2.2 Build 15(仅为语法兼容)。
V2.2 Build 16及以上版本(支持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、创建测试表并插入数据。
create table tb1_1152237(id int1 zerofill);
create table tb2_1152237(col1 int1 zerofill,col2 int2 zerofill,col3 int4 zerofill,col4 int8 zerofill);
create table tb3_1152237(col1 tinyint zerofill,col2 smallint zerofill,col3 int zerofill,col4 bigint zerofill,col5 varchar);
insert into tb1_1152237 values (1),(2);
insert into tb2_1152237 values (1,2,3,4);
insert into tb2_1152237 values (2,2,3,4),(3,4,5,6);
insert into tb3_1152237 values (1,2,3,4,'li');
insert into tb3_1152237 values (2,2,3,4,'liu'),(3,4,5,6,'ming');
2、查看数据。
select * from tb1_1152237 order by 1;
select * from tb2_1152237 order by 1;
select * from tb3_1152237 order by 1;
返回结果为:
id
-------
001
002
(2 rows)
col1 | col2 | col3 | col4
-------+-----------+------------+----------------------
001 | 00002 | 0000000003 | 00000000000000000004
002 | 00002 | 0000000003 | 00000000000000000004
003 | 00004 | 0000000005 | 00000000000000000006
(3 rows)
col1 | col2 | col3 | col4 | col5
-------+-----------+------------+----------------------+---------
001 | 00002 | 0000000003 | 00000000000000000004 | li
002 | 00002 | 0000000003 | 00000000000000000004 | liu
003 | 00004 | 0000000005 | 00000000000000000006 | ming
(3 rows)