常规数据类型
字符数据类型
CHAR/CHARACTER类型
语法:
CHAR[(长度)]
CHARACTER[(长度)]
功能:
CHAR 数据类型指定定长字符串。在基表中,定义 CHAR 类型的列时,可以指定一个不超过 32767 的正整数作为字节长度,例如:CHAR(100)。如果未指定长度,缺省为 1。CHAR 类型列的最大存储长度由数据库页面大小决定,长度不足时,自动填充空格。CHAR 数据类型最大存储长度和页面大小的对应关系请见表1.1.1。但是,在表达式计算中,该类型的长度上限不受页面大小限制,为 32767。
表1.1.1 最大存储长度和页面大小的对应关系
数据库页面大小 | 实际最大长度 |
4K | 约1900 |
8K | 约3900 |
16K | 约8000 |
32K | 约8188 |
这个限制长度只针对基表中的列,在定义变量的时候,可以不受这个限制长度的限制。
另外,实际插入表中的列长度要受到记录长度的约束,每条记录总长度不能大于页面大小的一半。
SET SCHEMA S1;
CREATE TABLE S1.T12 (num CHAR(10));
INSERT INTO S1.T12 VALUES('');
COMMIT;
INSERT INTO S1.T12 VALUES('aaa');
COMMIT;
INSERT INTO S1.T12 VALUES('aaaaabbbbb');
COMMIT;
SELECT * FROM S1.T12;
VARCHAR/VARCHAR2类型
语法:
VARCHAR[(长度[CHAR])]
功能:
VARCHAR 数据类型指定变长字符串,用法类似 CHAR 数据类型,可以指定一个不超过 32767 的正整数作为字节或字符长度,例如:VARCHAR (100)指定 100 字节长度;VARCHAR(100 CHAR)指定 100 字符长度。如果未指定长度,缺省为 8188 字节。
在基表中,当没有指定 USING LONG ROW 存储选项时,插入 VARCHAR 数据类型的实际最大存储长度由数据库页面大小决定;如果指定了USING LONG ROW 存储选项,则插入 VARCHAR 数据类型的长度不受数据库页面大小限制。VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为 32767。
CHAR 同 VARCHAR 的区别在于前者长度不足时,系统自动填充空格,而后者只占用实际的字节空间。另外,实际插入表中的列长度要受到记录长度的约束,每条记录总长度不能大于页面大小的一半。
该数据类型存储的数据量受到LENGTH_IN_CHAR和CHARSET参数的影响。根据数据库初始化时的参数不同,VARCHAR中能存储的汉字个数不同。主要由如下 2 个参数决定:
UNICODE_FALG:表示数据库中数据的字符集。可用 select unicode 来查询当前数据库的字符集种类,0 代表 gb18030;1 代表 UTF-8。
LENGTH_IN_CHAR:决定数据库中 VARCHAR 类型对象的长度是否以字符为单位。取值为 1 表示以字符为单位,将存储长度值按照理论字符长度进行放大。取值为 0 则所有 VARCHAR 以字节为单位。
VARCHAR2 类型和 VARCHAR 类型用法相同。
ROWID类型
语法:
ROWID
功能:
ROWID 类型数据由 18 位字符组成,用来表示 ROWID 数据。18 位字符由“4 位站点号+6 位分区号+8 位物理行号”组成。ROWID 类型数据可通过 SF_BUILD_ROWID()构造而来。
表中的 ROWID 类型列,可以用于排序或创建索引。但是 ROWID 类型不支持作为分区列和自定义类型的属性数据类型。ROWID 列与字符类型一样,支持 MAX,MIN 等集函数,不支持 SUM,AVG 等集函数。
例 创建一个含有 ROWID 类型的数据库表。
先构造 ROWID 数据。假定站点号为 1,分区号为 2,物理行号为 50。使用SF_BUILD_ROWID 函数构造出一个 ROWID 类型数据。
SELECT SF_BUILD_ROWID(1,2,50);
其中,AAAB 为站点号、AAAAAC 为分区号、AAAAAAAy 为 ROWID 值。
创建含有 ROWID 类型的表,并插入数据。
CREATE TABLE S1.T13(C1 INT,C2 ROWID);
INSERT INTO S1.T13 VALUES(8,'AAABAAAAACAAAAAAAy');
COMMIT;
SELECT C1,C2,ROWID FROM S1.T13;
数值数据类型
精确数值数据类型
NUMERIC/DECIMAL/DEC/NUMBER类型
NUMERIC/NUMBER/DECIMAL/DEC[( 精度 [, 标度])]
功能:
NUMERIC数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了总的数字数,精度范围是1至38。标度定义了小数点右边的数字位数。一个数的标度不应大于其精度,如果实际标度大于指定标度,那么超出标度的位数将会四舍五入省去。例如:NUMERIC(4,1)定义了小数点前面3位和小数点后面1位,共4位的数字,范围在-999.9到999.9。所有NUMERIC数据类型,如果其值超过精度,DM会返回一个出错信息,如果超过标度,则多余的位会被截断。
如果不指定精度和标度,缺省精度为38,标度无限定。
CREATE SCHEMA S1 AUTHORIZATION SYSDBA;
SET SCHEMA S1;
CREATE TABLE S1.T1 (num NUMERIC(4,1));
INSERT INTO S1.T1 VALUES(1.2345678);
COMMIT;
INSERT INTO S1.T1 VALUES(1.5);
COMMIT;
INSERT INTO S1.T1 VALUES(1.59);
COMMIT;
INSERT INTO S1.T1 VALUES(1);
COMMIT;
INSERT INTO S1.T1 VALUES(999.9);
COMMIT;
INSERT INTO S1.T1 VALUES(-999.9);
COMMIT;
INSERT INTO S1.T1 VALUES(0);
COMMIT;
SELECT * FROM S1.T1;
INTEGER/INT类型
语法:INTEGER/INT
功能:用于存储有符号整数,精度为 10,标度为 0。取值范围为:-2147483648 (-2^31)~+2147483647(2^31-1)。
CREATE TABLE S1.T3 (num INT);
INSERT INTO S1.T3 VALUES(123456);
COMMIT;
INSERT INTO S1.T3 VALUES(-123456);
COMMIT;
INSERT INTO S1.T3 VALUES(0);
COMMIT;
INSERT INTO S1.T3 VALUES(-0);
COMMIT;
INSERT INTO S1.T3 VALUES(1.11111);
COMMIT;
INSERT INTO S1.T3 VALUES(1.9);
COMMIT;
SELECT * FROM S1.T3;
BIGINT类型
语法:BIGINT
功 能 : 用 于 存 储 有 符 号 整 数 , 精 度 为 19 , 标 度 为 0 。 取 值 范 围 为 :-9223372036854775808(-2^63)~9223372036854775807(2^63-1)。
TINYINT/BYTE类型
语法:TINYINT
功能:用于存储有符号整数,精度为 3,标度为 0。取值范围为:-128~+127。
语法:BYTE
功能:与 TINYINT 相似,精度为 3,标度为 0。
SMALLINT类型
语法:SMALLINT
功 能 : 用 于 存 储 有 符 号 整 数 , 精 度 为 5 , 标 度 为 0 。 取 值 范 围 为 :-32768(-2^15)~+32767(2^15-1)。
BINARY类型
语法:
BINARY[(长度 )]
功能:
BINARY 数据类型指定定长二进制数据。缺省长度为 1 个字节,最大长度由数据库页面大小决定,具体可参考《DM8_SQL 语言使用手册》1.4.1 节。BINARY 常量以 0x 开始,后跟数据的十六进制表示,例如 0x2A3B4058。
CREATE TABLE S1.T4 (num BINARY(1));
INSERT INTO S1.T4 VALUES(1);
COMMIT;
INSERT INTO S1.T4 VALUES(255);
COMMIT;
INSERT INTO S1.T4 VALUES(256);
COMMIT;
INSERT INTO S1.T4 VALUES(257);
COMMIT;
SELECT * FROM S1.T4;
VARBINARY/RAW类型
语法:
VARBINARY[(长度)]
RAW[(长度)]
功能:VARBINARY 数据类型用来存储变长二进制数据,用法类似 BINARY 数据类型,可以指定一个不超过 32767 的正整数作为数据长度。缺省长度为 8188 个字节。VARBINARY数据类型的实际最大存储长度由数据库页面大小决定,具体最大长度算法与 VARCHAR 类型的相同,其在表达式计算中的长度上限也与 VARCHAR 类型相同,为 32767。
近似数值数据类型
FLOAT类型
语法:FLOAT[(精度)]
功能:FLOAT 是带二进制精度的浮点数,精度范围(1~126)。当精度小于等于 24 时,DM 将其转换为标准 C 语言中的 REAL 类型;当精度大于 24 时,转换为标准 C 语言中的DOUBLE 类型。
FLOAT 取值范围-1.7*10^308~1.7*10^308。
DOUBLE类型
语法:DOUBLE[(精度)]
功能:DOUBLE 是带二进制精度的浮点数。DOUBLE 类型的设置是为了移植的兼容性。该类型直接使用标准 C 语言中 DOUBLE。精度与取值范围与 FLOAT 一样。
REAL类型
语法:REAL
功能:REAL 是带二进制精度的浮点数,但它不能由用户指定使用的精度,系统指定其二进制精度为 24,十进制精度为 7。取值范围-3.4*10^38~3.4*10^38。
DOUBLE PRECISION类型
语法:DOUBLE PRECISION[(精度)]
功能:该类型指明双精度浮点数。DOUBLE PRECISION 类型的设置是为了移植的兼容性。该类型直接使用标准 C 语言中 DOUBLE。精度与取值范围与 FLOAT 一样。
位串数据类型
BIT类型
语法:
BIT
功能:
BIT 类型用于存储整数数据 1、0 或 NULL,可以用来支持 ODBC 和 JDBC 的布尔数据类型。DM 的 BIT 类型与 SQL SERVER2000 的 BIT 数据类型相似。功能与 ODBC 和 JDBC 的 BOOL 相同。
CREATE TABLE S1.T2 (num BIT);
INSERT INTO S1.T2 VALUES(1);
COMMIT;
INSERT INTO S1.T2 VALUES(0);
COMMIT;
INSERT INTO S1.T2 VALUES(NULL);
COMMIT;
SELECT * FROM S1.T2;
日期时间数据类型
一般日期时间数据类型
DATE类型
语法:
DATE
功能:
DATE 类型包括年、月、日信息,定义了’-4712-01-01’和’9999-12-31’之间任何一个有效的格里高利日期。
CREATE TABLE S1.T15 (t DATE);
INSERT INTO S1.T15 VALUES('2024-01-15');
COMMIT;
INSERT INTO S1.T15 VALUES('2024-08-15');
COMMIT;
INSERT INTO S1.T15 VALUES('1-1-1');
COMMIT;
INSERT INTO S1.T15 VALUES('9999-12-31');
COMMIT;
SELECT * FROM S1.T15;
TIME类型
语法:
TIME[(小数秒精度)]
功能:
TIME 类型包括时、分、秒信息,定义了一个在’00:00:00.000000’和’23:59:59.999999’之间的有效时间。TIME 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 0。
CREATE TABLE S1.T16 (t time(1));
INSERT INTO S1.T16 VALUES('9:56:16.111');
COMMIT;
INSERT INTO S1.T16 VALUES('09:57:01');
COMMIT;
SELECT * FROM S1.T16;
TIMESTAMP类型
语法:
TIMESTAMP[(小数秒精度)]
DATETIME[(小数秒精度)]
功能:
TIMESTAMP/DATETIME 类型包括年、月、日、时、分、秒信息,定义了一个在’-4712-01-0100:00:00.000000’和’9999-12-31 23:59:59.999999’之间的有效格里高利日期时间。小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 6。与 DATE 类型相同,DM 不计算'1582-10-05'到'1582-10-14'之间的 10 天。
TIMESTAMP 值的书写方式有两种:一是 TIMESTAMP'<DATE 值> <TIME 值>';二是'<DATE 值> <TIME 值>'。语法中,TIMESTAMP 也可以写为 DATETIME。
CREATE TABLE S1.T17 (t datetime(1));
INSERT INTO S1.T17 VALUES('09:58:30.123');
COMMIT;
INSERT INTO S1.T17 VALUES('09:58:59.600');
COMMIT;
INSERT INTO S1.T17 VALUES('2024-8-15');
COMMIT;
INSERT INTO S1.T17 VALUES('2024-8-15 10:01');
COMMIT;
INSERT INTO S1.T17 VALUES('2024 8 15 10 02');
COMMIT;
SELECT * FROM S1.T17;
时间间隔数据类型
年-月间隔类
INTERVAL YEAR TO MONTH 类型
语法:INTERVAL YEAR[(引导精度)]TO MONTH
功能:描述一个若干年若干月的间隔,引导精度规定了年的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。月的取值范围在 0 到 11 之间。例如:INTERVAL YEAR(4) TO MONTH,其中 YEAR(4)表示年的精度为 4,表示范围为负 9999 年零 11 月到正 9999 年零 11 月。一个合适的字值例子是:INTERVAL '0015-08' YEAR TO MONTH。
INTERVAL YEAR 类型
语法:INTERVAL YEAR[(引导精度)]
功能:描述一个若干年的间隔,引导精度规定了年的取值范围。引导精度取值范围为1~9,
如果未定义,缺省精度为 2。例如:INTERVAL YEAR(4),其中 YEAR(4)表示年的精度为 4,
表示范围为负 9999 年到正 9999 年。一个合适的字值例子是:INTERVAL '0015' YEAR。
INTERVAL MONTH 类型
语法:INTERVAL MONTH[(引导精度)]
功能:描述一个若干月的间隔,引导精度规定了月的取值范围。引导精度取值范围为1~9,如果未定义,缺省精度为 2。例如:INTERVAL MONTH(4),其中 MONTH(4)表示月的精度为 4,表示范围为负 9999 月到正 9999 月。一个合适的字值例子是:INTERVAL '0015' MONTH。
日-时间隔类
INTERVAL DAY 类型
语法:INTERVAL DAY[(引导精度)]
功能:描述一个若干日的间隔,引导精度规定了日的取值范围。引导精度取值范围为1~9,如果未定义,缺省精度为 2。例如:INTERVAL DAY(3),其中 DAY (3)表示日的精度为 3,表示范围为负 999 日到正 999 日。一个合适的字值例子是:INTERVAL '150' DAY。
INTERVAL DAY TO HOUR 类型
语法:INTERVAL DAY[(引导精度)] TO HOUR
功能:描述一个若干日若干小时的间隔,引导精度规定了日的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。而时的取值范围在 0 到 23 之间。例如:INTERVAL DAY(1) TO HOUR,其中 DAY(1)表示日的精度为 1,表示范围为负 9 日零 23 小时到正9日零 23 小时。一个合适的字值例子是:INTERVAL '9 23' DAY TO HOUR。
INTERVAL DAY TO MINUTE 类型
语法:INTERVAL DAY[(引导精度)] TO MINUTE
功能:描述一个若干日若干小时若干分钟的间隔,引导精度规定了日的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。而小时的取值范围在 0 到 23 之间,分钟的取值范围在 0 到 59 之间。例如:INTERVAL DAY(2) TO MINUTE,其中 DAY(2)表示日的精度为 2,表示范围为负 99 日零 23 小时零 59 分到正 99 日零 23 小时零 59 分。一个合适的字值例子是:INTERVAL '09 23:12' DAY TO MINUTE。
INTERVAL DAY TO SECOND 类型
语法:INTERVAL DAY[(引导精度)] TO SECOND [(小数秒精度)]
功能:描述一个若干日若干小时若干分钟若干秒的间隔,引导精度规定了日的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果不定义小数秒精度默认精度为 6。小时的取值范围在0到 23 之间,分钟的取值范围在 0 到 59 之间。例如:INTERVAL DAY(2) TO SECOND(1),其中 DAY(2)表示日的精度为 2,SECOND(1)表示秒的小数点后面取 1 位,表示范围为负99 日零 23 小时零 59 分零 59.9 秒到正 99 日零 23 小时零 59 分零 59.9 秒。一个合适的字值例子是:INTERVAL '09 23:12:01.1' DAY TO SECOND。
INTERVAL HOUR 类型
语法:INTERVAL HOUR[(引导精度)]
功能:描述一个若干小时的间隔,引导精度规定了小时的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。例如:INTERVAL HOUR(3),其中 HOUR (3)表示时的精度为 3,表示范围为负 999 小时到正 999 小时。例如:INTERVAL '150' HOUR。
INTERVAL HOUR TO MINUTE 类型
语法:INTERVAL HOUR[(引导精度)] TO MINUTE
功能:描述一个若干小时若干分钟的间隔,引导精度规定了小时的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。而分钟的取值范围在 0 到 59 之间。例如:INTERVAL HOUR(2) TO MINUTE,其中 HOUR(2)表示小时的精度为 2,表示范围为负99小时零 59 分到正 99 小时零 59 分。一个合适的字值例子是:INTERVAL '23:12' HOUR TO MINUTE。
INTERVAL HOUR TO SECOND 类型
语法:INTERVAL HOUR[(引导精度)] TO SECOND [(小数秒精度)]
功能:描述一个若干小时若干分钟若干秒的间隔,引导精度规定了小时的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 6。分钟的取值范围在 0 到 59 之间。例如:INTERVAL HOUR(2) TO SECOND(1),其中 HOUR(2)表示小时的精度为 2,SECOND(1)表示秒的小数点后面取 1 位,表示范围为负 99 小时零 59 分零 59.9 秒到正99小时零 59 分零 59.9 秒。一个合适的字值例子是:INTERVAL '23:12:01.1' HOUR TO SECOND。
INTERVAL MINUTE 类型
语法:INTERVAL MINUTE[(引导精度)]
功能:描述一个若干分钟的间隔,引导精度规定了分钟的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。例如:INTERVAL MINUTE(3),其中 MINUTE(3)表示分钟的精度为 3,表示范围为负 999 分钟到正 999 分钟。一个合适的字值例子是:INTERVAL '150' MINUTE。
INTERVAL MINUTE TO SECOND 类型
语法:INTERVAL MINUTE[(引导精度)] TO SECOND [(小数秒精度)]
功能:描述一个若干分钟若干秒的间隔,引导精度规定了分钟的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 6。例如:INTERVAL MINUTE(2) TO SECOND(1),其中 MINUTE(2)表示分钟的精度为 2,SECOND(1)表示秒的小数点后面取 1 位,表示范围为负 99 分零 59.9 秒到正 99 分零 59.9 秒。一个合适的字值例子是:INTERVAL '12:01.1' MINUTE TO SECOND。
INTERVAL SECOND 类型
语法:INTERVAL SECOND[(引导精度 [,小数秒精度] )]
功能:描述一个若干秒的间隔,引导精度规定了秒整数部分的取值范围。引导精度取值范围为 1~9,如果未定义,缺省精度为 2。小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 6。例如:INTERVAL SECOND(2,1),表示范围为负 99.9 秒到正 99.9 秒。一个合适的字值例子是:INTERVAL '51.1' SECOND。
时区数据类型
标准时区类型
TIME WITH TIME ZONE 类型
语法:
TIME[(小数秒精度)]WITH TIME ZONE
功能:
描述一个带时区的 TIME 值,其定义是在 TIME 类型的后面加上时区信息。时区部分的实质是 INTERVAL HOUR TO MINUTE 类型,取值范围:-12:59 与 +14:00 之间。例如:TIME ‘09:10:21 +8:00’。
CREATE TABLE S1.T18 (t TIME(1) WITH TIME ZONE);
INSERT INTO S1.T18 VALUES('10:04:46.123');
COMMIT;
SELECT * FROM S1.T18;
TIMESTAMP WITH TIME ZONE 类型
语法:
TIMESTAMP[(小数秒精度)]WITH TIME ZONE
功能:
描述一个带时区的 TIMESTAMP 值,其定义是在 TIMESTAMP 类型的后面加上时区信息。时区部分的实质是 INTERVAL HOUR TO MINUTE 类型,取值范围:-12:59 与 +14:00 之间。例如:’2009-10-11 19:03:05.0000 -02:10’。
CREATE TABLE S1.T19 (t TIMEstamp(1) WITH TIME ZONE);
INSERT INTO S1.T19 VALUES('10:07:32.666');
COMMIT;
SELECT * FROM S1.T19;
本地时区类型
TIMESTAMP WITH LOCAL TIME ZONE 类型
语法:
TIMESTAMP[(小数秒精度)]WITH LOCAL TIME ZONE
功能:
描述一个本地时区的 TIMESTAMP 值,能够将标准时区类型 TIMESTAMP WITH TIME ZONE 类型转化为本地时区类型,如果插入的值没有指定时区,则默认为本地时区。
CREATE TABLE S1.T20 (t TIMEstamp(1) WITH local TIME ZONE);
INSERT INTO S1.T20 VALUES('2024-08-15 10:10:26.111');
COMMIT;
INSERT INTO S1.T20 VALUES('2024-08-15 10:10:56.123 +08:00');
COMMIT;
INSERT INTO S1.T20 VALUES('2024-08-15 10:11:35.13215 +12:00');
COMMIT;
SELECT * FROM S1.T20;
多媒体数据类型
TEXT/LONG/LONGVARCHAR/CLOB类型
语法:
TEXT
LONG
LONGVARCHAR
CLOB
功能:
变长字符串类型,其字符串的长度最大为 100G-1,可用于存储长的文本串。
CREATE TABLE S1.T14 (t TEXT);
INSERT INTO S1.T14 VALUES('');
COMMIT;
INSERT INTO S1.T14 VALUES('达梦数据库');
COMMIT;
SELECT * FROM S1.T14;
select convert(varchar, t ) AS text_col FROM S1.T14;
IMAGE/LONGVARBINARY类型
语法:
IMAGE
LONGVARBINARY
功能:
可用于存储多媒体信息中的图像类型。图像由不定长的象素点阵组成,长度最大为 100G-1 字节。该类型除了存储图像数据之外,还可用于存储任何其它二进制数据。
BLOB类型
语法:
BLOB
功能:
BLOB 类型用于指明变长的二进制大对象,长度最大为 100G-1 字节。
BFILE类型
语法:
BFILE
功能:
BFILE 用于指明存储在操作系统中的二进制文件,文件存储在操作系统而非数据库中,仅能进行只读访问。