VastbaseG100

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

Menu

DECIMAL类型支持UNSIGINED ZEROFILL修饰符

功能描述

Vastbase在MySQL兼容模式下,DECIMAL类型支持UNSIGINED ZEROFILL修饰符,使用DECIMAL UNSIGINED ZEROFILL语法,可以创建一个只能存储非负数值,并且显示时总用零填充到指定长度的列。例如DECIMAL(10,2) UNSIGINED ZEROFILL将存储最大值为99999999.99的数值,并且在显示时,如果数值不足10位,将在前面填充零(例如00001234.56)。

UNSIGNED和ZEROFILL是两种可以与DECIMAL一起使用的属性,向带有UNSIGINED ZEROFILL修饰符的字段插入新值时,对数值的存储和显示的影响如下:

  • 严格模式:即设置参数vastbase_sql_mode的取值中包含sql_mode_strict,则必须限制插入的列值正负和长度。

  • 非严格模式:即设置参数vastbase_sql_mode的取值中不包含sql_mode_strict,如果遇到超出值域的值会将该值修改为最接近的边界值,不会报错,仅警告提示。

    • 插入的负数时被转换为0。
    • 插入超出上限的正数时,值会被转换为允许的最大上限值。

关于UNSIGINED和ZEROFILL修饰符详细请参考column定义支持ZEROFILL-UNSIGNED属性

  • DECIMAL(M,D)

    DECIMAL是一种用于存储精确数值的数据类型,适用于存储具有固定小数点的数值。

    • M:表示数值的总位数(包括小数点两边的数值)。
    • D:表示小数点后的位数。

    例如,DECIMAL(5,2)可以存储的最大值为999.99,最小值为-999.99(如果使用负号)。

  • UNSIGNED

    当UNSIGNED属性被指定时,它不允许存储负数值。这意味着数值将始终是非负的。

    例如,DECIMAL(5,2) UNSIGNED可以存储的最大值为999.99,并且不允许负数。

  • ZEROFILL

    ZEROFILL属性用于数值类型的列,当使用SHOW或SELECT查询时,它会将数值用零填充到指定的长度。

    例如,如果定义了一个DECIMAL(5,2) ZEROFILL的列,并且插入了值0.03,那么在查询时它将显示000.03。

注意事项

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

示例

1、创建测试表使用DECIMAL UNSIGINED ZEROFILL选项。

CREATE TABLE my_table_1219694 (
col1 bigint(20) unsigned NOT NULL AUTO_INCREMENT,
col2 decimal(10,2) unsigned zerofill DEFAULT NULL COMMENT '北槽海里数',
col3 numeric(10,5) ZEROFILL DEFAULT '1' COMMENT '指泊位置标志 1:true 0:false'
);

2、插入数据。

INSERT INTO my_table_1219694 (col2, col3) VALUES ('123.45', '0.12345');
INSERT INTO my_table_1219694 (col2, col3) VALUES ('678.90', '1.00000');

3、查询数据。

SELECT * FROM my_table_1219694; 

返回结果为:

 col1 |    col2     |    col3
------+-------------+-------------
 1    | 00000123.45 | 00000.12345
 2    | 00000678.90 | 00001.00000
(2 rows)

4、查询表结构。

\d+ my_table_1219694;

返回结果为:

                                                   Table "public.my_table_1219694"
 Column |              Type               |        Modifiers        | Storage | Stats target |         Description         | Attalias
--------+---------------------------------+-------------------------+---------+--------------+-----------------------------+----------
 col1   | uint8                           | not null AUTO_INCREMENT | plain   |              |                             | col1
 col2   | numeric(10,2) unsigned zerofill | default NULL::numeric   | main    |              | 北槽海里数                  | col2
 col3   | numeric(10,5) unsigned zerofill | default 1::numeric      | main    |              | 指泊位置标志 1:true 0:false | col3
Has OIDs: no
Options: orientation=row, compression=no, fillfactor=80

5、清理测试表。

DROP TABLE my_table_1219694;