理解达梦支持的数据类型,以及相关作用

常规数据类型

字符数据类型

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 用于指明存储在操作系统中的二进制文件,文件存储在操作系统而非数据库中,仅能进行只读访问。

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值