数据类型

本章节主要介绍在 DM 数据库支持的常规数据类型。DMSQL 程序支持所有的 DM SQL 数据类型,包括:精确数值数据类型、近似数值数据类型、字符数据类型、多媒体数据类型、一般日期时间数据类型、时间间隔数据类型。此外,DM SQL 还扩展支持了 %TYPE、%ROWTYPE、记录类型、数组类型、集合类型和类类型,用户还可以定义自己的子类型。

适用场景

软件 版本
操作系统 Redhat 7 及以上版本
DM 数据库 DM 8.0 及以上版本
CPU 架构 x86、ARM、龙芯、飞腾等国内外主流 CPU

常规数据类型

DM 数据库具有 SQL-92 的绝大部分数据类型,常规数据类型主要包括如下几大类:

  • 字符数据类型
  • 数值数据类型
  • 位串数据类型,即 bit 类型
  • 日期时间数据类型,包括一般日期类型、时间间隔日期类型
  • 多媒体数据类型,主要包括两种格式,字符串和二进制

操作方法

字符数据类型

根据数据库初始化时的参数不同,字符串中能存储的汉字的个数也不尽相同。主要由如下 2 个参数决定:

  • UNICODE_FALG:此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。需要注意的是,数据库一旦初始化完成,字符集就将无法修改。我们可以使用 select unicode 来查询当前数据库的字符集种类,0 代表 gb18030;1 代表 UTF-8。
  • LENGTH_IN_CHAR:此参数决定了数据库中的 VARCHAR 类型对象的长度是否以字符为单位。取值为 1 则设置为以字符为单位,将存储长度值按照理论字符长度进行放大。取值为 0 则所有 VARCHAR 类型对象的长度以字节为单位。

使用如下语句查询:

SELECT * FROM v$parameter WHERE name like '%LENGTH_IN_CHAR%';
注意

本文案例中的配置 UNICODE_FLAG=0,LENGTH_IN_CHAR=0。即字符集为 gb18030,varchar 长度以字节为单位。字符集在安装初始化库的时候指定,设定后不可更改。

  • 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;

char类型

注意

基表中,若没有指定 USING LONG ROW 存储选项时,插入 VARCHAR 数据类型的实际最大存储长度由数据库页面大小决定;如果指定了 USING LONG ROW 存储选项,则插入 VARCHAR 数据类型的长度不受数据库页面大小限制。VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为 32767。

//查询数据库的页大小
SELECT '页大小',cast(PAGE()/1024 as varchar);

数值数据类型

  • 精确数值数据类型包括:NUMERIC、DECIMAL、DEC 类型、NUMBER 类型、INTEGER 类型、INT 类型、BIGINT 类型、TINYINT 类型、BYTE 类型、SMALLINT 类型
  • 近似数值类型包括: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;

NUMERIC类型

位串数据类型

  • 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;

BIT类型

日期时间数据类型

日期时间数据类型分为一般日期时间数据类型、时间间隔数据类型和时区数据类型三类,用于存储日期、时间和它们之间的间隔信息。

  • 一般日期时间数据类型

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。

多媒体数据类型

多媒体数据类型的字值有两种格式:一是字符串,例如:'ABCD',二是 BINARY,如 0x61626364。

多媒体数据类型包括:

  • TEXT/LONGVARCHAR 类型:变长字符串类型,其字符串的长度最大为 2G-1,可用于存储长的文本串。
  • IMAGE/LONGVARBINARY 类型:可用于存储多媒体信息中的图像类型。
  • BLOB 类型:用于指明变长的字符串,长度最大为 2G-1 字节。
  • CLOB 类型:用于指明变长的字符串,长度最大为 2G-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 文件夹下。如有其他问题,请在社区内咨询。

微信扫码
分享文档
扫一扫
联系客服