VastbaseG100

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

Menu

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)