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

原文链接:
https://www.gbase.cn/community/post/4024
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在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字节

0~+65535

示例

(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)

原文链接:
https://www.gbase.cn/community/post/4024
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值