本章节主要介绍 DM 数据库支持的常规数据类型。DM SQL 程序支持所有的 DM SQL 数据类型,包括:精确数值数据类型、近似数值数据类型、字符数据类型、多媒体数据类型、一般日期时间数据类型、时间间隔数据类型。此外,DM SQL 还扩展支持了 %TYPE、%ROWTYPE、记录类型、数组类型、集合类型和类类型,用户还可以定义自己的子类型。
一、适用场景
软件 | 版本 |
---|---|
操作系统 | Redhat 7 及以上版本 |
DM 数据库 | DM 8.0 及以上版本 |
CPU 架构 | x86、ARM、龙芯、飞腾等国内外主流 CPU |
二、常规数据类型
DM 数据库具有 SQL-92 的绝大部分数据类型,常规数据类型主要包括如下几大类:
- 字符数据类型
- 数值数据类型
- 位串数据类型,即 bit 类型
- 日期时间数据类型,包括一般日期时间数据类型、时区数据类型和时间间隔数据类型
- 多媒体数据类型,主要包括两种格式,字符串和二进制
三、操作方法
3.1 字符数据类型
根据数据库初始化时的参数不同,字符串中能存储的汉字的个数也不尽相同。主要由如下参数决定:
UNICODE_FLAG
:此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。需要注意的是,数据库一旦初始化完成,字符集就将无法修改。我们可以使用select unicode
来查询当前数据库的字符集种类,0 代表 gb18030;1 代表 UTF-8。
注意本文案例中的配置 UNICODE_FLAG=0。即字符集为 gb18030,字符集在安装初始化库的时候指定,设定后不可更改。
- VARCHAR 类型
//创建表,定义字段为 VARCHAR 类型,定长为 10
CREATE TABLE dmhr.CHAR_TEST(
name VARCHAR(3)
);
//插入 1 个汉字成功
INSERT INTO dmhr.CHAR_TEST values('测');
COMMIT;
//插入 2 个汉字失败
INSERT INTO dmhr.CHAR_TEST values('测试');
COMMIT;
注意基表中,若没有指定 `USING LONG ROW` 存储选项时,插入 VARCHAR 数据类型的实际最大存储长度由数据库页面大小决定;如果指定了 `USING LONG ROW` 存储选项,则插入 VARCHAR 数据类型的长度不受数据库页面大小限制。VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为 32767。
//查询数据库的页大小
SELECT '页大小',cast(PAGE()/1024 as varchar);
3.2 数值数据类型
- 精确数值数据类型包括:NUMERIC、DECIMAL、DEC 类型、NUMBER 类型、INTEGER 类型、INT 类型、BIGINT 类型、TINYINT 类型、BYTE 类型、SMALLINT 类型、BINARY 类型、VARBINARY 类型。
- 近似数值类型包括:FLOAT 类型、DOUBLE 类型、REAL 类型、DOUBLE PRECISION 类型。
NUMERIC 数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了总的数字数,精度范围是 1 至 38。标度定义了小数点右边的数字位数。一个数的标度不应大于其精度,如果实际标度大于指定标度,那么超出标度的位数将会四舍五入省去。
例如:NUMERIC(4,1) 定义了小数点前面 3 位和小数点后面 1 位,共 4 位的数字,范围在 -999.9 到 999.9。所有 NUMERIC 数据类型,如果其值超过精度,会返回一个出错信息,如果超过标度,则多余的位会被截断。
使用语法:NUMERIC[(精度 [, 标度])],DECIMAL、DEC 类型、NUMBER 类型与 NUMERIC 的语法一致。
//创建表,定义金额字段为 NUMERIC 类型,精度为 10, 标度为 2
//即小数点前面 8 位,小数点后面 2 位
CREATE TABLE dmhr.NUMERIC_TEST(
cust_id INT NOT NULL,
amt NUMERIC(10,2)
);
//插入数据
INSERT INTO dmhr.NUMERIC_TEST values('10000001','88888888.99');
INSERT INTO dmhr.NUMERIC_TEST values('10000002','-66666666.99');
COMMIT;
SELECT * FROM dmhr.NUMERIC_TEST;
3.3 位串数据类型
- BIT 类型语法:BIT
注意BIT 类型用于存储整数数据 1、0 或 NULL,只有 0 才转换为假,其他非空、非 0 值都会自动转换为真,可以用来支持 ODBC 和 JDBC 的布尔数据类型。DM 的 BIT 类型与 SQL Server 2000 的 BIT 数据类型相似。
//创建表,定义性别字段为 sex, 1-男,0-女
CREATE TABLE dmhr.BIT_TEST(
cust_id INT NOT NULL,
cust_name VARCHAR(10),
sex BIT
);
//插入数据
INSERT INTO dmhr.BIT_TEST values('10000001','李丽',1);
INSERT INTO dmhr.BIT_TEST values('10000002','王强',0);
COMMIT;
SELECT * FROM dmhr.BIT_TEST;
3.4 日期时间数据类型
日期时间数据类型分为一般日期时间数据类型、时间间隔数据类型和时区数据类型三类,用于存储日期、时间和它们之间的间隔信息。
- 一般日期时间数据类型
DATE 类型包括年、月、日信息;TIME 类型包括时、分、秒信息;TIMESTAMP 类型包括年、月、日、时、分、秒信息。
//创建表,定义 3 个日期时间数据类型,DATE、TIME 及 TIMESTAMP
CREATE TABLE dmhr.DATE_TEST(
cust_id INT NOT NULL,
goods VARCHAR(10),
pay_date DATE,
pay_time TIME(2),
pay_timestamp TIMESTAMP
);
//插入数据
INSERT INTO dmhr.DATE_TEST
values('10000001','百事可乐','2020-11-19','23:59:59.99','2020-11-19 23:59:59.999999');
INSERT INTO dmhr.DATE_TEST
values('10000002','可口可乐','2020-11-18','10:05:30.00','2020-11-18 10:05:30.000000');
COMMIT;
SELECT * FROM dmhr.DATE_TEST;
注意TIME 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 0。 TIMESTAMP 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 6。
- 时间间隔数据类型
DM 支持两类时间间隔类型:年-月间隔类和日-时间隔类,它们通过时间间隔限定符区分,前者结合了日期字段年和月,后者结合了时间字段日、时、分、秒。时间间隔数据类型所描述的值是有符号的。
注意使用时间间隔数据类型时,如果不指定精度,那么将使用默认精度 6。
3.5 多媒体数据类型
多媒体数据类型的字值有两种格式:一是字符串,例如:'ABCD',二是 BINARY,如 0x61626364。
多媒体数据类型包括:
- TEXT/LONG/LONGVARCHAR 类型:变长字符串类型。其字符串的长度最大为 100G-1,用于存储长的文本串。
- IMAGE/LONGVARBINARY 类型:用于指明多媒体信息中的图像类型,长度最大为 100G-1 字节。
- BLOB 类型:用于指明变长的二进制大对象,长度最大为 100G-1 字节。
- CLOB 类型:用于指明变长的字母数字字符串,长度最大为 100G-1 字节。
- BFILE 类型:用于指明存储在操作系统中的二进制文件。
//创建表,定义多个多媒体数据类型字段
CREATE TABLE dmhr.TEXT_TEST(
c1 TEXT,
c2 BLOB,
c3 CLOB,
c4 IMAGE
);
//插入数据
INSERT INTO dmhr.TEXT_TEST values('dameng','0x123456789','clob','0x987654321');
commit;
SELECT * FROM dmhr.TEXT_TEST;
注意BLOB 和 IMAGE 类型的字段内容必须存储十六进制的数字串内容
四、参考文档
更多 SQL 语言使用说明,请参考《DM_SQL 语言使用手册》,手册位于数据库安装路径 /dmdbms/doc
文件夹下。如有其他问题,请在社区内咨询。