达梦数据类型
- 1.背景
- 2.要求
- 3.描述与使用
- 3.1 常规数据类型
- 3.1.1 字符数据类型
- 3.1.1.1 CHAR类型
- 3.1.1.2 CHARACTER类型
- 3.1.1.3 VARCHAR类型
- 3.1.2 数值数据类型
- 3.1.2.1 NUMERIC类型
- 3.1.2.2 DECIMAL类型
- 3.1.2.3 DEC类型
- 3.1.2.4 NUMBER类型
- 3.1.2.5 INTEGER类型
- 3.1.2.6 INT类型
- 3.1.2.7 BIGINT类型
- 3.1.2.8 TINYINT类型
- 3.1.2.9 BYTE类型
- 3.1.2.10 SMALLINT类型
- 3.1.2.11 BINARY类型
- 3.1.2.12 VARBINARY类型
- 3.1.2.13 FLOAT类型
- 3.1.2.14 DOUBLE类型
- 3.1.2.15 REAL类型
- 3.1.2.16 DOUBLE PRECISION 类型
- 3.2 位串数据类型
- 3.2.1 BIT类型
- 3.3 日期时间数据类型
- 3.3.1 一般日期时间数据类型
- 3.3.1.1 DATE类型
- 3.3.1.2 TIME类型
- 3.3.1.3 TIMESTAMP类型
- 3.3.2 时间间隔数据类型
- 3.3.2.1 年-月间隔类
- 3.3.2.2 日-时间隔类
- 3.3.3 时区数据类型
- 3.3.3.1 TIME WITH TIME ZONE 类型
- 3.3.3.2 TIMESTAMP WITH TIME ZONE类型
- 3.3.3.3 TIMESTAMP WITH LOCAL TIME ZONE类型
- 3.4 多媒体数据类型
- 3.4.1 TEXT/LONG/LONGVARCHAR类型
- 3.4.2 IMAGE/LONGVARBINARY类型
- 3.4.3 BLOB类型
- 3.4.4 CLOB类型
- 3.4.5 BFILE类型
- 4.实验结论
- 4.1 常规数据类型
- 4.2 位串数据类型
- 4.3 日期时间数据类型
- 4.4 多媒体数据类型
1.背景
数据类型是可表示值的集。值的逻辑表示是<字值>。值的物理表示依赖于实现。DM 系统具有 SQL-92 的绝大部分数据类型,以及部分 SQL-99 和 SQL Server 2000 的数据类型。
2.要求
理解达梦支持的数据类型,以及相关作用
3.描述与使用
3.1 常规数据类型
3.1.1 字符数据类型
3.1.1.1 CHAR类型
功能:CHAR 数据类型指定定长字符串。在基表中,定义 CHAR 类型的列时,可以指定一个不超过 32767 的正整数作为字节长度,例如:CHAR(100)。如果未指定长度,缺省为 1。长度不足时,自动填充空格。
举例:
create table test1 (id char(10));
insert into test1 values('');commit;
insert into test1 values('aaaaa');commit;
select * from test1;
在插入空字符串时,内容被自动填充。
3.1.1.2 CHARACTER类型
功能:和CHAR相同
3.1.1.3 VARCHAR类型
功能:VARCHAR 数据类型指定变长字符串,用法类似 CHAR 数据类型,可以指定一个不超过 32767 的正整数作为字节或字符长度,例如:VARCHAR (100)指定 100 字节长度;VARCHAR(100 CHAR)指定 100 字符长度。如果未指定长度,缺省为 8188 字节。
CHAR 同 VARCHAR 的区别在于前者长度不足时,系统自动填充空格,而后者只占用实际的字节空间。另外,实际插入表中的列长度要受到记录长度的约束,每条记录总长度不能大于页面大小的一半。
举例:
create table test2 (id varchar(10));
insert into test2 values('');commit;
insert into test2 values('aaaaa');commit;
select * from test2;
插入空字符串没有填充内容
3.1.2 数值数据类型
3.1.2.1 NUMERIC类型
功能:NUMERIC数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了总的数字数,精度范围是1至38。标度定义了小数点右边的数字位数。一个数的标度不应大于其精度,如果实际标度大于指定标度,那么超出标度的位数将会四舍五入省去。例如:NUMERIC(4,1)定义了小数点前面3位和小数点后面1位,共4位的数字,范围在-999.9到999.9。所有NUMERIC数据类型,如果其值超过精度,DM会返回一个出错信息,如果超过标度,则多余的位会被截断。
举例:
create table test4 (num NUMERIC(4,1));
insert into test4 values(1.23456);commit;
insert into test4 values(1);commit;
insert into test4 values(0);commit;
select * from test4;
3.1.2.2 DECIMAL类型
功能:和NUMERIC相似
3.1.2.3 DEC类型
功能:和DECIMAL相同
3.1.2.4 NUMBER类型
功能:和NUMERIC相同
3.1.2.5 INTEGER类型
功能:用于存储有符号整数,精度为 10,标度为 0。取值范围为:-2147483648 (-2^ 31)~+2147483647(2^31-1)。
举例:
CREATE TABLE test5 (num INTEGER);
INSERT INTO test5 VALUES(123456);COMMIT;
INSERT INTO test5 VALUES(-123456);COMMIT;
INSERT INTO test5 VALUES(0);COMMIT;
INSERT INTO test5 VALUES(-0);COMMIT;
INSERT INTO test5 VALUES(1.11111);COMMIT;
INSERT INTO test5 VALUES(1.9);COMMIT;
SELECT * FROM test5;
3.1.2.6 INT类型
功能:和INTEGER相同
3.1.2.7 BIGINT类型
功能:用于存储有符号整数,精度为19,标度为0。取值范围为:-9223372036854775808(-2^ 63)~9223372036854775807(2^63-1)。
3.1.2.8 TINYINT类型
功能:用于存储有符号整数,精度为 3,标度为 0。取值范围为:-128~+127
3.1.2.9 BYTE类型
功能:与TINYINT相似,精度为3,标度为0。
3.1.2.10 SMALLINT类型
功能:用于存储有符号整数,精度为5,标度为0。取值范围为:-32768(-2^ 15)~+32767(2^15-1)。
3.1.2.11 BINARY类型
功能:BINARY 数据类型用来存储定长二进制数据。在基表中,定义 BINARY 类型的列时,其最大存储长度由数据库页面大小决定,可以指定一个不超过其最大存储长度的正整数作为列长度,缺省长度为 1 个字节。BINARY 类型在表达式计算中的长度上限为 32767。BINARY 常量以 0x 开始,后面跟着数据的十六进制表示,例如:0x2A3B4058。
举例:
CREATE TABLE test6 (num BINARY(1));
INSERT INTO test6 VALUES(1);COMMIT;
INSERT INTO test6 VALUES(255);COMMIT;
INSERT INTO test6 VALUES(256);COMMIT;
INSERT INTO test6 VALUES(257);COMMIT;
SELECT * FROM test6;
3.1.2.12 VARBINARY类型
功能:VARBINARY数据类型用来存储变长二进制数据,用法类似 BINARY 数据类型,可以指定一个不超过32767的正整数作为数据长度。缺省长度为 8188个字节。VARBINARY数据类型的实际最大存储长度由数据库页面大小决定,具体最大长度算法与VARCHAR类型的相同,其在表达式计算中的长度上限也与VARCHAR类型相同,为32767。
3.1.2.13 FLOAT类型
功能:FLOAT是带二进制精度的浮点数,精度范围(1~126)。当精度小于等于 24 时,DM 将其转换为标准 C 语言中的 REAL 类型;当精度大于 24 时,转换为标准 C 语言中的DOUBLE 类型。FLOAT 取值范围-1.7*10308~1.7*10308。
举例:
CREATE TABLE test7 (num FLOAT(3));
INSERT INTO test7 VALUES(1);COMMIT;
INSERT INTO test7 VALUES(0.555555555555555555);COMMIT;
INSERT INTO test7 VALUES(6666.555555555555555555);COMMIT;
INSERT INTO test7 VALUES(6666666666666.555555555555555555);COMMIT;
SELECT * FROM test7;
3.1.2.14 DOUBLE类型
功能:DOUBLE 是带二进制精度的浮点数。DOUBLE 类型的设置是为了移植的兼容性。该类型直接使用标准 C 语言中 DOUBLE。精度与取值范围与 FLOAT 一样。
3.1.2.15 REAL类型
功能:REAL是带二进制精度的浮点数,但它不能由用户指定使用的精度,系统指定其二进制精度为24,十进制精度为7。取值范围-3.4*1038~3.4*1038。
举例:
CREATE TABLE test8 (num REAL);
INSERT INTO test8 VALUES(1);COMMIT;
INSERT INTO test8 VALUES(0);COMMIT;
INSERT INTO test8 VALUES(0.555555555555555555555555);COMMIT;
INSERT INTO test8 VALUES(1.555555555555555555555555);COMMIT;
INSERT INTO test8 VALUES(1e3);COMMIT;
INSERT INTO test8 VALUES(3.4E38);COMMIT;
INSERT INTO test8 VALUES(34000000000000);COMMIT;
INSERT INTO test8 VALUES(340000000000000000000000000000000000001);COMMIT;
SELECT * FROM test8;
3.1.2.16 DOUBLE PRECISION 类型
功能:该类型指明双精度浮点数。DOUBLE PRECISION 类型的设置是为了移植的兼容性。该类型直接使用标准 C 语言中 DOUBLE。精度与取值范围与 FLOAT 一样。
3.2 位串数据类型
3.2.1 BIT类型
功能:BIT 类型用于存储整数数据 1、0 或 NULL,只有 0 才转换为假,其他非空、非0值都会自动转换为真,可以用来支持 ODBC 和 JDBC 的布尔数据类型。DM 的 BIT 类型与SQL SERVER2000 的 BIT 数据类型相似。功能与 ODBC 和 JDBC 的 BOOL 相同。
举例:
CREATE TABLE test9 (num BIT);
INSERT INTO test9 VALUES(1);COMMIT;
INSERT INTO test9 VALUES(0);COMMIT;
INSERT INTO test9 VALUES(NULL);COMMIT;
SELECT * FROM test9;
3.3 日期时间数据类型
日期时间数据类型分为一般日期时间数据类型、时间间隔数据类型和时区数据类型三类,用于存储日期、时间和它们之间的间隔信息。
3.3.1 一般日期时间数据类型
3.3.1.1 DATE类型
功能:DATE 类型包括年、月、日信息,定义了’-4712-01-01’和’9999-12-31’之间任何一个有效的格里高利日期。DM 支持儒略历,并考虑了历史上从儒略历转换至格里高利日期时的异常,将’1582-10-05’到’1582-10-14’之间的日期统一当做’1582-10-15’处理。DATE 值的书写方式有两种:一是 DATE’年月日’;二是’年月日’。其中,年月日之间可以使用分隔符或者没有分隔符。分隔符是指除大小写字母、数字以及双引号之外的所有单字节字符且是可打印的。例如: 空格、回车键、tab 键、- / , . : *等标点符号。年月日中第一个非 0 数值前的 0 亦可省略,例如:‘0001-01-01’等价于’1-1-1’。
举例:
CREATE TABLE test10 (t DATE);
INSERT INTO test10 VALUES('2024-01-15');COMMIT;
INSERT INTO test10 VALUES('2024-1-1');COMMIT;
INSERT INTO test10 VALUES('1-1-1');COMMIT;
INSERT INTO test10 VALUES('9999-12-31');COMMIT;
SELECT * FROM test10;
3.3.1.2 TIME类型
功能:TIME 类型包括时、分、秒信息,定义了一个在 ‘00:00:00.000000’ 和’23:59:59.999999’之间的有效时间。TIME 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 0。
举例:
CREATE TABLE test11 (t time(1));
INSERT INTO test11 VALUES('12:00:22.111');COMMIT;
INSERT INTO test11 VALUES('12:00:11');COMMIT;
SELECT * FROM test11;
3.3.1.3 TIMESTAMP类型
功能:TIMESTAMP 类型包括年、月、日、时、分、秒信息,定义了一个在’-4712-01-01 00:00:00.000000000’和’9999-12-31 23:59:59.999999999’之间的有效格里高利日期时间。TIMESTAMP 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~9,如果未定义,缺省精度为 6。与 DATE 类型相同,DM 不计算’1582-10-05’到’1582-10-14’之间的 10 天。
举例:
CREATE TABLE test12 (t timestamp(1));
INSERT INTO test12 VALUES('12:00:22.111');COMMIT;
INSERT INTO test12 VALUES('12:00:11');COMMIT;
INSERT INTO test12 VALUES('2024-1-15');COMMIT;
INSERT INTO test12 VALUES('2024-1-15 16:17');COMMIT;
INSERT INTO test12 VALUES('2024-1-15 16');COMMIT;
INSERT INTO test12 VALUES('2024-1 16');COMMIT;
INSERT INTO test12 VALUES('2024 1 23 13 11');COMMIT;
SELECT * FROM test12;
3.3.2 时间间隔数据类型
3.3.2.1 年-月间隔类
(1)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。
(2)INTERVAL YEAR 类型
功能:描述一个若干年的间隔,引导精度规定了年的取值范围。引导精度取值范围为1~9,如果未定义,缺省精度为 2。例如:INTERVAL YEAR(4),其中 YEAR(4)表示年的精度为 4,表示范围为负 9999 年到正 9999 年。一个合适的字值例子是:INTERVAL ‘0015’ YEAR。
(3)INTERVAL MONTH类型
功能:描述一个若干月的间隔,引导精度规定了月的取值范围。引导精度取值范围为1~9,如果未定义,缺省精度为 2。例如:INTERVAL MONTH(4),其中 MONTH(4)表示月的精度为 4,表示范围为负 9999 月到正 9999 月。一个合适的字值例子是:INTERVAL ‘0015’ MONTH。
3.3.2.2 日-时间隔类
(1)INTERVAL DAY类型
功能:描述一个若干日的间隔,引导精度规定了日的取值范围。引导精度取值范围为1~9,如果未定义,缺省精度为 2。例如:INTERVAL DAY(3),其中 DAY (3)表示日的精度为 3,表示范围为负 999 日到正 999 日。一个合适的字值例子是:INTERVAL ‘150’ DAY。
(2)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。
(3)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。
(4)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。
(5)INTERVAL HOUR类型
功能:描述一个若干小时的间隔,引导精度规定了小时的取值范围。引导精度取值范围 为 1~9,如果未定义,缺省精度为 2。例如:INTERVAL HOUR(3),其中 HOUR (3)表示时 的精度为 3,表示范围为负 999 小时到正 999 小时。例如:INTERVAL ‘150’ HOUR。
3.3.3 时区数据类型
3.3.3.1 TIME WITH TIME ZONE 类型
功能:描述一个带时区的 TIME 值,其定义是在 TIME 类型的后面加上时区信息。
举例:
CREATE TABLE test13 (t TIME(1) WITH TIME ZONE);
INSERT INTO test13 VALUES('12:00:22.111');COMMIT;
SELECT * FROM test13;
3.3.3.2 TIMESTAMP WITH TIME ZONE类型
功能:描述一个带时区的 TIMESTAMP 值,其定义是在 TIMESTAMP 类型的后面加上时区信息。
举例:
CREATE TABLE test14 (t TIMEstamp(1) WITH TIME ZONE);
INSERT INTO test14 VALUES('12:00:22.111');COMMIT;
SELECT * FROM test14;
3.3.3.3 TIMESTAMP WITH LOCAL TIME ZONE类型
功能:描述一个本地时区的 TIMESTAMP 值,能够将标准时区类型 TIMESTAMP WITH TIME ZONE 类型转化为本地时区类型,如果插入的值没有指定时区,则默认为本地时区。
举例:
CREATE TABLE test15 (t TIMEstamp(1) WITH TIME ZONE);
INSERT INTO test15 VALUES('12:00:22.111');COMMIT;
SELECT * FROM test15;
3.4 多媒体数据类型
3.4.1 TEXT/LONG/LONGVARCHAR类型
功能:变长字符串类型。其字符串的长度最大为 100G-1 字节。DM 利用它存储长的文本串。
举例:
CREATE TABLE TEST16 (t TEXT);
INSERT INTO TEST16 VALUES('');COMMIT;
INSERT INTO TEST16 VALUES('ABCD');COMMIT;
INSERT INTO TEST16 VALUES('ABCDEFGH');COMMIT;
SELECT * FROM TEST16;
TEXT类型查询出来默认为<长文本>,无法直接查看数据,可通过convert(varchar, 列名 )来转换,但注意varchar类型有长度限制。
3.4.2 IMAGE/LONGVARBINARY类型
功能:用于指明多媒体信息中的图像类型。图像由不定长的像素点阵组成,长度最大为 100G-1 字节。该类型除了存储图像数据之外,还可用于存储任何其它二进制数据。
3.4.3 BLOB类型
功能:BLOB 类型用于指明变长的二进制大对象,长度最大为 100G-1 字节。
3.4.4 CLOB类型
功能:与 TEXT 相同。
3.4.5 BFILE类型
功能:BFILE 用于指明存储在操作系统中的二进制文件,文件存储在操作系统而非数据库中,仅能进行只读访问。
4.实验结论
4.1 常规数据类型
-CHAR/CHARACTER类型:定长字符串,最大长度由数据库页面大小决定。
-VARCHAR类型:可变长字符串,最大长度由数据库页面大小决定。
-NUMERIC[精度,标度]:用于存储零、正负定点数。精度范围1至38
-NUMBER类型:跟NUMERIC相同
-DECIMAL/DEC类型:跟NUMERIC相似
-INTEGER/INT类型:用于存储有符号整数,精度为10
-BIGINT类型:用于存储有符号整数,精度为19,标度为0
-TINYINT类型:用于存储有符号整数,精度为3,标度为0。取值范围为:-128~+127
-BYTE类型:与TINYINT相似,精度为3,标度为0
-SMALLINT类型:用于存储有符号整数,精度为5,标度为0
-BINARY类型:指定定长二进制数据
-VARBINARY类型:指定变长二进制数据。用法类似BINARY数据类型
-REAL类型:带二进制的浮点数
-FLOAT类型:二进制精度的浮点数,精度最大不超过53
-DOUBLE类型:同FLOAT相似,精度最大不超过53
-DOUBLE PRECISION类型:该类型指明双精度浮点数,其二进制精度为53,十进制精度为15
4.2 位串数据类型
-BIT类型:用于存储整数数据1、0或null
4.3 日期时间数据类型
-DATE类型:包括年、月、日信息,定义了‘-4712-01-01’和‘9999-12-31’之间任何一个有效的格里高利日期
-TIME类型:包括时、分、秒信息
-TIMESTAMP/DATATIME:包括年、月、日、时、分、秒信息
-TIME WITH TIME ZONE类型:描述一个带时区的TIME值
-TIMESTAMP WITH TIME ZONE类型
-TIMESTAMP WITH LOCAL TIME ZONE类型:描述一个本地时区的TIMESTAMP值
4.4 多媒体数据类型
-TEXT/LONGVARCHAR类型:变长字符串类型,其字符串的长度最大为2G-1,可用于存储长的文本串
-IMAGE/LONGVARBINARY类型:可用于存储多媒体信息中的图像类型
-BLOB类型:用于指明变长的字符串,长度最大为2G-1字节
-CLOB类型:用于指明变长的字符串,长度最大为2G-1字节
-BFILE类型:用于指明存储在操作系统中的二进制文件
达梦社区地址 https://eco.dameng.com