GBase 8c B兼容库说明(二)

在dophin插件的加持下,GBase 8c B兼容性数据库(dbcompatibility='B',下文称为B兼容库)在数据类型方面的MySQL兼容性得到极大增强。以常见的数据类型为例:
数值类型
相比于GBase8c原生语法,dolphin对于数值类型的修改主要为:
(1)新增INT/TINYINT/SMALLINT/BIGINT支持可选的修饰符(n),即支持TINYINT(n)/SMALLINT(n)/BIGINT(n)的用法,n无实际意义,不影响任何表现。
(2)新增MEDIUMINT(n)数据类型,是INT4的别名,n无实际作用,不影响任何表现。存储空间为4字节,数据范围为-2,147,483,648~+2,147,483,647。
(3)新增FIXED[(p[,s])]数据类型,是NUMERIC类型的别名。用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。
(4)新增float4(p[,s])的方式,等价于dec(p[,s])。
(5)新增double数据类型,是float8的别名。
(6)新增float4/float支持可选的修饰符(n),即支持float4(n)/float(n)的用法,当n在[1,24]之间时,float4(n)/float(n)代表单精度浮点数;当n在[25,53]之间时,float4(n)/float(n)代表双精度浮点数。
(7)对于decimal/dec/fixed/numeric数据类型,在未指定精度的情况下,默认精度为(10,0),即总位数为10,小数位数为0。
(8)新增UNSIGNEDINT/TINYINT/SMALLINT/BIGINT类型,与普通整型相比,其最高位是数字位而非符号位;此外,在GBase8c中,TINYINT默认为无符号类型,而在B库中则默认是有符号的。
(9)新增zerofill属性修饰,只是语法上的支持,实际并没有填充零的效果。与UNSIGNED的作用等价。
(10)新增cast函数类型转换参数signed/unsigned,其中castasunsigned将类型转换为uint8,castassigned将类型转换为int8.
(11)新增float(p,s),double(p,s),real(p,s),doubleprecision(p,s)的语法,其中float(p,s),real(p,s),doubleprecision(p,s)大致等价于dec(p,s),与dec(p,s)不同的是,float(p,s),real(p,s),doubleprecision(p,s)的p和s必须为整数,而double(p,s)则完全等价于dec(p,s)。舍入方式为四舍五入。
表1 整数类型
名称 | 描述 | 存储空间 | 范围 |
TINYINT(n) | 微整数,别名为INT1。n无实际作用,不影响任何表现。 | 1字节 | -128~+127 |
SMALLINT(n) | 小范围整数,别名为INT2。n无实际作用,不影响任何表现。 | 2字节 | -32768~+32767 |
INTEGER(n) | 常用的整数,别名为INT4。n无实际作用,不影响任何表现。 | 4字节 | -2147483648~+2147483647 |
MEDIUMINT(n) | INT4的别名,n无实际作用,不影响任何表现。 | 4字节 | -2147483648~+2147483647 |
BIGINT(n) | 大范围的整数,别名为INT8。n无实际作用,不影响任何表现。 | 8字节 | -9223372036854775808~+9223372036854775807 |
TINYINT(n) UNSIGNED | 无符号微整数,别名为UINT1。n无实际作用,不影响任何表现。 | 1字节 | 0~255 |
SMALLINT(n) UNSIGNED | 无符号小范围整数,别名为UINT2。n无实际作用,不影响任何表现。 | 2字节 |
|
示例
(1)创建具有TINYINT(n),SMALLINT(n),MEDIUMINT(n),BIGINT(n)类型数据的表。
CREATE TABLE int_type_t1
(
IT_COL1 TINYINT(10),
IT_COL2 SMALLINT(20),
IT_COL3 MEDIUMINT(30),
IT_COL4 BIGINT(40),
IT_COL5 INTEGER(50)
);
(2)查看表结构。
\d int_type_t1
返回结果为:
Table"public.int_type_t1"
Column|Type|Modifiers
---------+----------+-----------
IT_COL1|tinyint|
IT_COL2|smallint|
IT_COL3|integer|
IT_COL4|bigint|
IT_COL5|integer|
(3)创建带zerofill属性字段的表。
CREAT ETABLE int_type_t2
(
IT_COL1 TINYINT(10) zerofill,
IT_COL2 SMALLINT(20 )unsigned zerofill,
IT_COL3 MEDIUMINT(30) unsigned,
IT_COL4 BIGINT(40) zerofill,
IT_COL5 INTEGER(50) zerofill
);
(4)查看表结构。
\dint_type_t2
返回结果为:
Table"public.int_type_t2"
Column|Type|Modifiers
---------+-------+-----------
IT_COL1|uint1|
IT_COL2|uint2|
IT_COL3|uint4|
IT_COL4|uint8|
IT_COL5|uint4|
(5)利用cast unsigned将表达式转换为uint8类型。
select cast(1-2 as unsigned);
返回结果为:
uint8
----------------------
18446744073709551615
(1row)
(6)利用castsigned将表达式转换为int8类型。
select cast(1-2 as signed);
返回结果为:
int8
------
-1
(1row)
表2 任意精度类型
名称 | 描述 | 存储空间 | 范围 |
NUMERIC[(p[,s])] DECIMAL[(p[,s])] FIXED[(p[,s])] | 精度p取值范围为[1,1000],标度s取值范围为[0,p]。说明:p为总位数,s为小数位数。 | 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 | 未指定精度的情况下,等价于(10,0),即小数点前最大10位,小数点后0位。 |
NUMBER[(p[,s])] | NUMERIC类型的别名。 | 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 | 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
示例
(1)创建具有FIXED(p,s),FIXED,decimal,number类型数据的表。
CREATE TABLE dec_type_t1
(
DEC_COL1 FIXED,
DEC_COL2 FIXED(20,5),
DEC_COL3 DECIMAL,
DEC_COL4 NUMBER
);
(2)查看表结构。
\d dec_type_t1
返回结果为:
Table"public.dec_type_t1"
Column | Type | Modifiers
----------+---------------+-----------
DEC_COL1|numeric(10,0)|
DEC_COL2|numeric(20,5)|
DEC_COL3|numeric(10,0)|
DEC_COL4|numeric|
表3 浮点类型
名称 | 描述 | 存储空间 | 范围 |
FLOAT[(p)] FLOAT4[(p)] | 浮点数,不精准。精度p取值范围为[1,53]。 | 4字节或8字节 | 当精度p在[1,24]之间时,选项REAL作为内部表示,当精度p在[25,53]之间时,选项DOUBLEPRECISION作为内部表示。如不指定精度,内部用REAL表示。 |
DOUBLEPRECISION FLOAT8 DOUBLE | 双精度浮点数,不精准。 | 8字节 | -79E+308~79E+308,15位十进制数字精度。 |
FLOAT4(p,s) | 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明:p为总位数,s为小数位位数,等价于dec(p,s)。 | 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 | - |
FLOAT(p,s) DOUBLE(p,s) REAL(p,s) DOUBLEPRECISION(p,s) | 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明:p为总位数,s为小数位位数,其中float(p,s),real(p,s),doubleprecision(p,s)大致等价于dec(p,s),但p和s都必须为整数,而double(p,s)完全等价于dec(p,s)。舍入方式为四舍五入。 | 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 | - |
字符类型
相比于GBase8c原生语法,dolphin对于字符类型的修改主要为:
(1)修改CHARACTER/NCHAR类型n的含义,n是指字符长度而不是字节长度。
(2)所有的字符数据类型在对比时,均忽略尾部空格,如where条件过滤场景、join场景等。例如'a'::text='a'::text为真。需要特别注意的是,对于VARCHAR、VARCHAR2、VARCHAR2、NVARCHAR、TEXT、CLOB类型,只有GUC参数string_hash_compatible为on的情况下,hashjoin以及hashagg才会忽略尾部空格。
(3)新增NATIONALVARCHAR(n),为NVARCHAR2(n)类型的别名,n是指字符长度。
(4)新增TEXT支持可选的修饰符(n),即支持TEXT(n)的用法,n无实际意义,不影响任何表现。
(5)新增TINYTEXT(n)/MEDIUMTEXT(n)/LONGTEXT(n)数据类型,是TEXT的别名,n无实际作用,不影响任何表现。
表4 字符类型
名称 | 描述 | 存储空间 |
CHAR(n) CHARACTER(n) NCHAR(n) | 定长字符串,不足补空格。n是指字符长度,如不带精度n,默认精度为1。 | 最大为10MB。 |
NATIONAL VARCHAR(n) | 变长字符串。是NVARCHAR2(n)类型的别名。n是指字符长度。 | 最大为10MB。 |
TEXT(n), TINYTEXT(n), MEDIUMTEXT(n), LONGTEXT(n) | 变长字符串。n无实际含义,不影响任何表现 | 最大为1GB-1,但还需要考虑到列描述头信息的大小,以及列所在元组的大小限制(也小于1GB-1),因此TEXT类型最大大小可能小于1GB-1。 |
示例
(1)创建测试表并插入数据。
CREATE TABLE char_type_t1
(
CT_COL1 CHARACTER(4),
CT_COL2 TEXT(10),
CT_COL3 TINYTEXT(11),
CT_COL4 MEDIUMTEXT(12),
CT_COL5 LONGTEXT(13)
);
(2)查询看表结构。
\d char_type_t1
返回结果为:
Table"public.char_type_t1"
Column|Type|Modifiers
---------+--------------+-----------
CT_COL1|character(4)|
CT_COL2|text|
CT_COL3|text|
CT_COL4|text|
CT_COL5|text|
(3)向表中插入数据。
INSERT INTO char_type_t1VALUES('四个字符');
(4)查询数据。
SELECT CT_COL1,length(CT_COL1) FROM char_type_t1;
返回结果为:
CT_COL1|length
----------+--------
四个字符|12
(1row)
评论


热门帖子
- 12023-05-09浏览数:16799
- 22019-04-26浏览数:10231
- 32020-05-11浏览数:10134
- 42023-09-25浏览数:9529
- 52023-07-04浏览数:9441