作者:ShunWah
在运维管理领域,我拥有多年深厚的专业积累,兼具坚实的理论基础与广泛的实践经验。我始终站在技术前沿,致力于推动运维自动化,不懈追求运维效率的最大化。
我精通运维自动化流程,对于OceanBase、MySQL等多种数据库的部署与运维,具备从初始部署到后期维护的全链条管理能力。凭借OceanBase的OBCA和OBCP认证、OpenGauss社区认证结业证书,以及崖山DBCA、亚信AntDBCA、翰高HDCA、GBase 8a | 8c | 8s、Galaxybase GBCA、Neo4j Graph Data Science Certification、NebulaGraph NGCI等多项权威认证,我不仅展现了自己的专业技能,也彰显了对技术的深厚热情与执着追求。
在OceanBase & 墨天轮的技术征文大赛中,我凭借卓越的技术实力和独特的见解,多次荣获一、二、三等奖。同时,在OpenGauss第五届、第六届、第七届技术征文大赛,TiDB社区第三届专栏征文大赛,金仓数据库有奖征文活动,以及首批YashanDB「产品体验官」尝鲜征文等活动中,我也屡获殊荣。此外,我还活跃于墨天轮、CSDN等技术平台,经常发布原创技术文章,并多次被首页推荐,积极与业界同仁分享我的运维经验和独到见解。
引言
GBase 8s是天津南大通用数据技术股份有限公司自主研发的一款成熟稳定的企业级分布式事务型数据库,拥有自主知识产权,并在市场上有着广泛的应用。其数据类型系统丰富多样,包括内置数据类型和扩展数据类型两大类,能够满足各种复杂的数据存储和查询需求。

GBase 8s数据类型
GBase 8s 支持多种数据类型。
GBase 8s 的基本数据类型,多数与其它数据库产品兼容。
GBase 8s 提供了一些特有的数据类型,如Serial,Money,方便用户使用。
GBase 8s 的日期时间类型,可通过环境变量设置,定义日期时间格式,方便用户使用。

一、GBase 8s内置数据类型
内置数据类型包括:
GBase 8s的内置数据类型主要包括字符类、数字类、时间类和大对象类。
1、字符类:
字符类数据类型主要用于存储文本数据,包括CHAR、VARCHAR、VARCHAR2、LVARCHAR、NCHAR、NVARCHAR、CHARACTER VARYING等。这些类型能够处理从固定长度到可变长度的字符串,满足不同场景下的文本存储需求。
2、数字类:
数字类数据类型用于存储数值数据,如BIGINT、BIGSERIAL等。其中,BIGINT数据类型能够存储从-(2^63 -1)到2^63 -1的8个字节的整数值,具有较大的存储范围和运算优势。BIGSERIAL数据类型则存储BIGINT数据类型的顺序整数,由数据库服务器在插入新行时自动指定。
3、时间类:
时间类数据类型用于存储日期和时间信息,虽然文章中没有详细列出具体的时间类数据类型,但GBase 8s无疑会支持常用的日期和时间数据类型,如DATE、TIME、TIMESTAMP等。
4、大对象类:
大对象类数据类型用于存储大量的文本、图形、声音等内容。GBase 8s支持简单大对象和智能大对象数据类型。简单大对象包括Text和Byte两种类型,分别用于存储大文本信息和二进制数据,最大支持2G。智能大对象则包括CLOB和BLOB两种类型,分别用于存储智能大字符对象和智能二进制对象,最大支持4T。
5、下表列出GBase 8s支持的所有内置数据类型。
| 数据类型 | 解释 |
|---|---|
| BIGINT | 存储 8 个字节的整数值,从 -(263 -1) 到 263 -1 |
| BIGSERIAL | 存储 8 个字节的正整数(自动生成),范围是 1 到 263 -1 |
| BYTE | 存储任何种类的二进制数据,最长 231 个字节 |
| CHAR(n) | 存储字符串 |
| CHARACTER(n) | CHAR 的同义词 |
| CHARACTER VARYING(m,r) | 存储可变长度字符串(符合 ANSI) |
| DATE | 存储日期 |
| DATETIME | 存储日期时间 |
| DEC | DECIMAL 的同义词 |
| DECIMAL | 存储精度可定义的浮点数 |
| DECIMAL (p,s) 定点 | 存储已定义小数位和精度的定点数 |
| DOUBLE PRECISION | FLOAT 的同义词 |
| FLOAT(n) | 存储相应于 C 中的 DOUBLE 数据类型的双精度浮点数 |
| INT | INTEGER 的同义词 |
| INT8 | 存储 8 个字节的整数值,从 -(263 -1) 到 263 -1 |
| INTEGER | 存储从 -2,147,483,647 到 +2,147,483,647 的整数 |
| INTERVAL | 以年和月为单位存储时间范围 |
| INTERVAL | 以连续的单位日、小时、分钟、秒和秒的若干分之几存储时间范围 |
| MONEY(p,s) | 存储货币值 |
| NCHAR(n) | 与 CHAR 相同 |
| NUMERIC(p,s) | DECIMAL(p,s) 的同义词 |
| NVARCHAR(m,r) | 与 VARCHAR 相同 |
| REAL | SMALLFLOAT 的同义词 |
| SERIAL(n) | 在 INT 的正数范围内存储整数 (自动生成) |
| SERIAL8(n) | 在 INT8 的正数范围内存储整数 (自动生成) |
| SMALLFLOAT | 存储对应于 C 语言的 float 数据类型的单精度浮点数 |
| SMALLINT | 存储从 -32,767 到 +32,767 的整数 |
| TEXT | 存储任何种类的文本数据,最长 231 个字节 |
| VARCHAR(m,r) | 存储可变长度字符串(最长 32,765 个字节) |
二、扩展数据类型
除了内置数据类型外,GBase 8s还支持扩展数据类型,包括复杂数据类型和用户定义的数据类型。
1、复杂数据类型:
复杂数据类型主要用于处理结构化的数据,包括collection和row两种类型。其中,collection类型包括Set、List、Multiset等,用于存储集合类型的数据。Row类型则用于表示多列的数据结构,类似于表中的一行数据。
2、用户定义数据类型:
用户定义数据类型允许用户根据自己的需求定义新的数据类型。在GBase 8s中,用户可以通过opaque和distinct两种方式来定义新的数据类型。这些自定义数据类型可以在数据库中的表、视图、存储过程等对象中使用,提高了数据处理的灵活性和可重用性。
3、下表列出GBase 8s 支持的扩展数据类型
| BLOB | 以随机存取块的形式存储二进制数据 |
|---|---|
| binaryvar18 | 存储18字节二进制编码的字符串 |
| binaryvar | 存储最大长度为255个字节的二进制编码的字符串 |
| BOOLEAN | 存储布尔值true和flase |
| CLOB | 以随机存取块的形式存储文本数据 |
| DISTINCT | 以用户定义的类型存储数据,该类型与它所基于的源类型具有相同的格式,但该类型的强制转型和函数与源类型的不同 |
| 日历 | 存储TimeSeries数据类型的日历 |
| 日历模式 | 存储日历数据类型的日历模式的结构 |
| IDSSECURITYLABEL | 存储LBAC安全标号对象 |
| LIST(e) | 存储元素的按顺序排序的集合,所有元素都具有同一数据类型e;允许重复值 |
| lld_locator | 存储大对象标识 |
| lld_lob_data | 存储智能大对象的位置,并指定对象是否包含二进制或字符数据 |
| LVARCHAR(m) | 存储可变长度字符串,可多至32,739个字节 |
| MULTISET(e) | 存储值的非排序集合,所有元素都具有同一数据类型e;允许重复值 |
| 节点(node) | 存储最多256个字符的可变长度的整数和小数点集合(用于表示分层关系) |
| OPAQUE | 存储用户定义的数据类型,其内部结构对于数据库服务器不可存取 |
| ROW已命名 | 存储命名ROW类型 |
| ROW未命名 | 存储未命名ROW类型 |
| SET(e) | 存储元素的非排序集合,所有元素都具有同一数据类型e;不允许重复值 |
| ST_LineString | 存储一维对象作为定义线性插值路径的点序列 |
| ST_MultiLineString | 存储ST_LineString的数据类型的集合 |
| ST_MultiPoint | 存储ST_Point数据类型的集合 |
| ST_MultiPolygon | 存储ST_Polygon数据类型的集合 |
| ST_Point | 存储占用坐标空间中单个位置的零维几何 |
| ST_Polygon | 存储二维表面,并且作为定义外部边界环以及0或0个以上内部环的点序列存储 |
| TimeSeries | 存储行子类型的集合 |
此外,GBase 8s还支持XML数据类型,这是一种特殊的数据类型,用于存储XML格式的数据。
三、数据类型演示
1、查看GBase 8s的进程信息
GBase 8s启动后,会运行名称为oninit的进程,可以使用ps命令查看。
[gbasedbt@CAIP131 ~]$
[gbasedbt@CAIP131 ~]$ ps -ef | grep oninit
[gbasedbt@CAIP131 ~]$

2、查看数据库运行状态
可以使用onstat命令,查看数据库运行状态。
[gbasedbt@CAIP131 ~]$ onstat -
Your evaluation license will expire on 2025-05-13 00:00:00
On-Line -- Up 00:09:22 -- 15834664 Kbytes
[gbasedbt@CAIP131 ~]$

命令输出显示,当前数据库运行在OnLine状态。
注意:数据库在线状态时,再次启动数据库会报错。
3、登录数据库安装
可以使用客户端工具,验证数据库功能是否正常。
[gbasedbt@CAIP131 ~]$
[gbasedbt@CAIP131 ~]$ dbaccess - -
Your evaluation license will expire on 2025-05-13 00:00:00
>

验证结果显示,GBase 8s可以创建数据库,创建表,可以插入和查询数据。数据库功能正常。
4、创建员工信息表
> database mydb;
Database closed.
Database selected.
> create table t_employee(
f_employeeid serial,
f_employeename varchar(50),
f_age int,
f_weight float,
f_height decimal(18,6),
f_salary money,
f_joindate date,
f_inputdate datetime year to second);> > > > > > > >
Table created.
>

4.1 验证serial数据类型
插入三条记录,只输入员工姓名
> insert into t_employee(f_employeename) values('Tom');
insert into t_employee(f_employeename) values('Jack');
insert into t_employee(f_employeename) values('Mary');
1 row(s) inserted.
>
1 row(s) inserted.
>

4.2 查询员工ID和员工姓名
> select f_employeeid, f_employeename from t_employee;
1 row(s) inserted.
f_employeeid f_employeename
1 Tom
2 Jack
3 Mary
3 row(s) retrieved.
>

结论:在不提供Serial字段数值情况下,Serial字段会自动为新插入记录生成一个递增数值。
4.3 插入两条记录,输入员工ID和员工姓名
>
> insert into t_employee(f_employeeid, f_employeename) values(5, 'Henry');
insert into t_employee(f_employeeid, f_employeename) values(8, 'Rose');
1 row(s) inserted.
>

4.4 查询员工ID和员工姓名
> select f_employeeid, f_employeename from t_employee;
1 row(s) inserted.
f_employeeid f_employeename
1 Tom
2 Jack
3 Mary
5 Henry
8 Rose
5 row(s) retrieved.
>

结论:在提供Serial字段数值情况下,新插入记录的Serial字段使用提供的数值,不再自动生成新值。
4.5 插入一条记录,只输入员工姓名
> insert into t_employee(f_employeename) values('Bill');
1 row(s) inserted.
>

4.6 查询员工ID和员工姓名
> select f_employeeid, f_employeename from t_employee;
f_employeeid f_employeename
1 Tom
2 Jack
3 Mary
5 Henry
8 Rose
9 Bill
6 row(s) retrieved.
>

结论:当新插入的数据未提供Serial字段数值时,新记录的Serial字段值为当前表记录最大值加1。
4.7 插入一条记录,输入员工ID和员工姓名
> insert into t_employee(f_employeeid, f_employeename) values(6, 'Kate');
1 row(s) inserted.
>

4.8 查询员工ID和员工姓名
> select f_employeeid, f_employeename from t_employee;
f_employeeid f_employeename
1 Tom
2 Jack
3 Mary
5 Henry
8 Rose
9 Bill
6 Kate
7 row(s) retrieved.
>

4.9 插入一条记录,输入员工姓名
> insert into t_employee(f_employeename) values('Bob');
1 row(s) inserted.
>

4.10 查询员工ID和员工姓名
> select f_employeeid, f_employeename from t_employee;
f_employeeid f_employeename
1 Tom
2 Jack
3 Mary
5 Henry
8 Rose
9 Bill
6 Kate
10 Bob
8 row(s) retrieved.
>

结论:当Serial字段数值出现【空位置】时,可以指定确定的值进入插入。
5、验证money数据类型
5.1更新Bill的f_salary字段
> update t_employee set f_salary = 1234567890.1234 where f_employeeid = 9;
1 row(s) updated.
>

5.2 查询员工ID,员工姓名,薪水
> select f_employeeid, f_employeename, f_salary from t_employee where f_employeeid > 8;
f_employeeid 9
f_employeename Bill
f_salary RMB 1234567890.12
f_employeeid 10
f_employeename Bob
f_salary
2 row(s) retrieved.
>

> unload to '/home/gbasedbt/employee.txt' delimiter ','
select f_employeeid, f_employeename, f_salary
from t_employee
where f_employeeid > 8;> > >
2 row(s) unloaded.
>

> !cat /home/gbasedbt/employee.txt;
9,Bill,1234567890.12,
10,Bob,,
>

结论:Money类型会根据本地化设置,自动显示相应的货币符号和保留对应的小数位数,但数据本身仍然是一个定点小数,并不存储有关货币符号的信息。
6、验证date数据类型
6.1 默认的date类型格式为月/日/年(如06/18/2020),当未设置任何有关date数据类型的环境变量时
> update t_employee set f_joindate = '06/18/2020' where f_employeeid = 1;
1 row(s) updated.
执行date数据操作时,如果日期格式不匹配,可能出现下面的错误
> update t_employee set f_joindate = '2020-06-18' where f_employeeid = 1;
1205: Invalid month in date
Error in line 1
Near character position 69
>

6.2 设置如下环境变量,设置自己使用的日期格式
export GL_DATE="%iY-%m-%d"

6.3 再次执行更新操作
> !echo $GL_DATE
%iY-%m-%d
> update t_employee set f_joindate = '2020-06-18' where f_employeeid = 1;
1 row(s) updated.
> select f_employeeid, f_employeename,f_joindate from t_employee where f_employeeid = 1;
f_employeeid f_employeename f_joindate
1 Tom 2020-06-18
1 row(s) retrieved.
>
结论:GBase 8s可以根据数据中日期的具体格式,设置对应的GL_DATE,完成日期格式的输入。
7、验证datetime数据类型
7.1 默认的datetime类型格式为【2020-06-18 12:34:56】。
update t_employee set f_inputdate = '2020-06-18 12:34:56' where f_employeeid = 2;
7.2 直接使用年月日时分秒的格式(如2020-06-18 12:34:56),更新datetime字段。
> update t_employee set f_inputdate = '2020-06-18 12:34:56' where f_employeeid = 2;
1 row(s) updated.
> select f_employeeid, f_employeename,f_inputdate from t_employee where f_employeeid = 2;
f_employeeid 2
f_employeename Jack
f_inputdate 2020-06-18 12:34:56
1 row(s) retrieved.
>
8、验证int、float、decimal类型
8.1 通过员工ID,更新员工年龄
> update t_employee set f_age = 28 where f_employeeid = 1;
1 row(s) updated.
>

8.2 查询员工ID,员工姓名,年龄
> update t_employee set f_age = 28 where f_employeeid = 1;
1 row(s) updated.
> select f_employeeid, f_employeename, f_age from t_employee where f_employeeid = 1;
f_employeeid f_employeename f_age
1 Tom 28
1 row(s) retrieved.
>

8.3 通过员工ID,更新员工体重
>
> update t_employee set f_weight = 56.78 where f_employeeid = 1;
1 row(s) updated.
>

8.4 查询员工ID,员工姓名,体重
> update t_employee set f_weight = 56.78 where f_employeeid = 1;
1 row(s) updated.
> select f_employeeid, f_employeename, f_weight from t_employee where f_employeeid = 1;
f_employeeid 1
f_employeename Tom
f_weight 56.78000000000
1 row(s) retrieved.
>

8.5 通过员工ID,更新员工身高
update t_employee set f_height = 1.86 where f_employeeid = 1;
8.6 查询员工ID,员工姓名,身高
> update t_employee set f_height = 1.86 where f_employeeid = 1;
1 row(s) updated.
> select f_employeeid, f_employeename, f_height from t_employee where f_employeeid = 1;
f_employeeid 1
f_employeename Tom
f_height 1.860000
1 row(s) retrieved.
>

总结
数据类型在数据库中扮演着至关重要的角色。它们不仅决定了数据的存储方式和所占用的空间大小,还影响了数据的查询效率和准确性。在GBase 8s中,丰富的数据类型系统使得数据库能够存储和处理各种类型的数据,满足不同应用场景下的需求。同时,GBase 8s还支持分布式部署、集中式部署等多种部署方式,以及两地三中心高可用部署等高级特性,为超大规模数据管理提供了高性价比的通用计算平台。
GBase 8s的数据类型系统丰富多样,能够满足各种复杂的数据存储和查询需求。无论是在金融、电信行业的关键核心业务系统中,还是在安全、党政、国防等行业对信息安全性有较高要求的信息系统中,GBase 8s都能够提供稳定可靠的数据存储和查询服务。




