HHF_MySQL数据类型_简述
Posted haikuoyuntian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HHF_MySQL数据类型_简述相关的知识,希望对你有一定的参考价值。
1.整数类型
TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT,存储需求分别是1字节、2字节、3字节、4字节、8字节,整数类型字段属性可以添加AUTO_INCREMENT 自增约束条件。指定整数值显示宽度,可使用INT(M)进行设置。数值的个数如果小于指定的宽度时,显示由空格填充,如果大于指定显示宽度,但只要不超过该类类型取值范围,数据依然可以正常显示。由于符号占用一个数字,所以TINYINT默认显示宽度是4.
• 例如:TINYINT类型存储需求是一个字节(8bit),无符号最大值 28-1,即 0~255;有符号最大值27-1,即 -128~127.
• 例如:INT(4) 表示最大有效显示宽度为4,即最大显示数值个数为4.
2.浮点数类型
浮点类型:单精度FLOAT、双精度型DOUBLE,存储需求分别是4字节、8字节;定点类型:DECIMAL,存储需求M+2字节;浮点类型和定点类型都可以用(M/D)来表示,M表示宽度,指位数的个数;D表示标度,指小数的位数。浮点类型取值范围:M(1~255)、D(1~30,且不能大于M-2)
• 例如:create table ex2 (a FLOAT(4,1),b DOUBLE(4,1),c DECIMAL(4,1));
insert into ex2 VALUES(4.23,4.26,4.234);
显示结果: a b c
4.2 4.2 4.2
3.日期与时间类型
日期数据类型包括:YEAR、TIME、 DATE、DATETIME、 TIMESTAMP,
日期格式分别是:YYYY、HH:MM:SS 、 YYYY-MM-DD、YYYY-MM-DD HH:MM:SS、 YYYY-MM-DD HH:MM:SS
存储需求分别是:1字节、 3字节 、 3字节 、8字节 、4字节
§ YEAR类型:以4位字符串或者4位数字格式表示YEAR,其范围1901~2155,输入格式为“YYYY”或YYYY。以2位字符串格式表示YEAR,范围为“00”到“99”。“00”~“69”转换为2000~2069,“70”~“99”转换为1970~1999;输入“0”与“00”取值相同,皆为2000. 以2位数字表示YEAR,范围位1~99。1~69和70~99范围的值分别被转换为2001~2069和1970~1999范围YEAR值。注意:0值被转换为0000,而不是2000。
• 例如:
create table ex3(a YEAR);
insert into ex3 values(2015),(‘2015‘);
显示结果: a
2015
2015
insert table ex3 values(2499)
显示结果:ERROR 1264
结论:插入值不论是数值还是字符串,都能被正确的存储到数据库中,但是假如超过了YEAR类型取值范围。
delete from ex3; #清空ex3
insert into ex3 values (‘0‘),(‘00‘),(‘89‘),(‘15‘);
显示结果: a
2000
2000
1989
2015
结论:字符串‘0‘、‘00‘转换结果一样,2000;字符串‘89‘、‘15‘分别转换成1989,2015;但是换成数值,0、00,结果就0000,0000。
§ TIME类型 :用来只需记录时间信息的值,需要3个字节存储。格式为“HH:MM:SS”。TIME取值范围为 -838:59:59~838:59:59,小时部分值大的原因是表示每件事过去发生的时间或者两个事件时间间隔。
• 例如:
create table ex4 (a TIME)
show create table ex4
insert into ex4 values(‘10:55:08‘),(‘22:59‘),(‘3 10:55‘),(‘4 08‘),(‘20‘)
select * form ex4
显示结果: a
10:55:08
22:59:00
82:55:00
104:00:00
00:00:20
结论:如遇到“D HH:MM”格式,其中D表示日,取值范围是0~34,在插入数据库时,D被转换成为小时保存,格式为“D*24 + HH”.
insert into ex4 values(106508)
显示结果:1292 - Incorrect time value: ‘106508‘ for column ‘a‘ at row 1
结论:106508中的分钟超过了59,数据不能插入。
§ DATE类型:用在仅存储日期值的时候,不存储时间,存储需要3字节。日期格式:YYYY-MM-DD。使用CURRENT_DATE或者NOW(),插入当年计算机系统的日期。插入两位字符串数据,如“98-12-31”,“981231”,“001231”,“151213”分别转换为1998-12-31、1998-12-31、2000-12-31/2015-12-13;如插入两位数字表示日期值,如 981231、001231、151213 分别转换为1998-12-31、2000-12-31、2015-12-13.
• 例如:
insert into ex5 values(98-12-31)
显示结果:1292 - Incorrect date value: ‘55‘ for column ‘a‘ at row 1
§ DATETIME 类型:同时包含日期和时间信息,存储需要8个字节。日期格式为YYYY-MM-DD HH:MM:SS,可以使用字符串类型或者数值类型的数据,只需符合DATETIME的日期格式即可。以“YYYY-MM-DD HH:MM:SS”或者“YYYMMDDHHMMSS”字符串格式表示日期,取值范围“1000-01-01 00:00:00”~“9999-12-31 23:59:59”;如插入“2014-12-31 11:28:30”或者“20141231112830”,插入数据库的DATETIME值都是2014-12-31 11:28:30.
• 例如:
create table ex6(a DATETIME)
insert into ex6 values(19981231121212),(150303030303)
显示结果: a
1998-12-31 12:12:12
2015-03-03 03:03:03
insert into ex6 values(CURRENT_TIMESTAMP),(NOW())
显示结果:(系统当前日期时间,请大家各自演示)
§ TIMESTAMP类型:显示格式与DATETIME相同,显示宽度固定在19个字符,格式为:YYYY-MM-DD HH:MM:SS 存储需要4个字节。但是TIMESTAMP取值范围小于DATETIME。因此,在使用过程中要注意保证合法取值范围。如插入“[email protected]@31 10*10*10”转换为1999-12-31-10:10:10.
• 例如:
create table ex7(a TIMESTAMP)
insert into ex7 values(NOW())
显示结果:2019-03-15 15:21:33
set time_zone="+7:00" #中国时区在东八区,现在设置为东七区,执行命令set time_zone="+7:00".
select * from ex7
显示结果:2019-03-15 14:21:33 #执行上述命令,经过时区转换之后,值减少了一个小时.
4.字符串类型
mysql支持两类字符串数据:文本字符串和二进制字符串。字符串类型指:CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET。VARCHAR和TEXT是变长类型存储需求取决于值的实际长度,而不是类型最大可能长度。
§ CHAR(M)为固定长度字符串,M为长度,取值范围0~255;VARCHAR(M)是可变长字符串,M为长度,取值范围0~65535.且最大实际长度由最长字段的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长加1.
• 例如:
create table ex8 (a CHAR(5),b VARCHAR(5))
insert into ex8 values(‘ab ‘,‘ab ‘)
select *from ex8
显示结果: a b
ab ab
#效果不明显,使用concat函数返回带有连接参数‘(‘和’)’的结果如下所示
select concat(‘(‘,a,‘)‘),concat(‘(‘,b,‘)‘) from ex8
显示结果: concat(‘(,a,)‘) concat(‘(,b,)‘)
(ab) (ab )
§ TEXT字段保存非二进制字符串,如文章内容、评论和留言等。当保存或查询TEXT字段的值时,不删除尾部空格。TEXT类型分为4中,TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,存储空间和数据长度不同,分别是28-1、216-1、224-1、232-1个字符。
§ ENUM 是一个字符串对象,其值为表创建时在字段规定中枚举的一列值,语法如下:字段名 ENUM(‘值1’,‘值2’,‘值3’,......,‘值n’),ENUM值依照索引顺序排列,并且空字符串排在非空字符串之前,NULL值排在其他所有枚举值之前。
• 例如:
create table ex9(a ENUM(‘X‘,‘Y‘,‘Z‘))
insert into ex9 values(‘y‘),(‘x‘),(‘z‘),(NULL)
select a,a+0 from ex9
显示结果: a a+0
y 2
x 1
z 3
null null
create table ex10 (score TINYINT,grade ENUM(‘distinct‘,‘good‘,‘pass‘,‘fail‘))
insert into ex10 values (80,‘good‘),(98,1),(65,3),(46,‘fail‘)
显示结果: score grade
80 good
98 distinct
65 pass
46 fail
#加入再插入测试数据,如以下SQL语句
insert into ex10 value(100,‘best‘)
显示结果:1265 - Data truncated for column ‘grade‘ at row 1
#无论插入ENUM类型枚举列表中的字符串值还是其对应索引的编号,都可以正确存储数据。但是加入插入的值不是枚举列表中的内容,比如上述中的‘best’,系统就会报错。
§ SET类型:是一个字符串对象,可以有零或多个值,SET字段最大可以有64个成员,其值为表创建时规定的一列值。语法格式如下:SET(‘值1’,‘值2’,‘值3’......‘值n’);SET值在内部用整数表示,列表中每一个值都有一个索引编号。当创建表示,SET成员值的尾部空格将自动被删除。 如果插入SET的值有重复,MySQL会自动删除重复的值。插入SET字段的值的顺序不重要,MySQL会在存入数据库的时候,按照定义的顺序显示,如果插入了不正确的值,默认情况下,MySQL将忽略这些值,并给出警告。
• 例如:
create table ex11 (a SET(‘x‘,‘y‘,‘z‘))
insert into ex11 values(‘x‘),(‘x,z,y‘),(‘z,x,y‘),(‘z,y‘)
显示结果: a
x
x,z
x,y,x
y,z
insert into ex11 values(‘m,y‘)
显示结果:1265 - Data truncated for column ‘a‘ at row 1
#由结果可以得知,如果插入的值被包含在SET集合中,但是有重复值,结果只取一个,如果插入的值不按SET定义时的顺序排序,则会自动排序插入,如果试图插入非SET集合中的值,系统提示错误,禁止插入。
5.二进制类型
MySQL支持两种字符型数据:文本字符串和二进制字符串。二进制数据类型有:BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。
§ BIT类型:BIT(M)为为字段类型,M表示每个值的位数,取值范围1~64。如果M被省略,默认为1。如果为BIT(M)字段分配的值的长度小于M位,值左边补0;如果为BIT(6)字段分配一个值b ‘101‘, 其效果与分配 b ‘000101‘相同。BIT数据类型用来保存位字段值,例如,以二进制的形式保存十进制数据12,12的二进制形式为1100,在这里需要位数至少为4位的BIT类型,即可以定义字段类型BIT(4)。大于二进制1111的数据不能插入BIT(4)类型的字段中。
• 例如:
create table ex12 (a BIT(4))
insert into ex12 values(3),(5),(15)
显示结果: a
0011
0101
1111
insert into ex12 values(16)
显示结果:1406 - Data too long for column ‘a‘ at row 1 #超出了BIT(4)的取值范围,系统报错。
select BIN(a+0) from ex12
显示结果:
BIN(a+0)
11
111
1111
§ BINARY和VARBINARY类型:类似CHAR和VARCHAR,不同的是他们包含二进制字符串。语法格式:字段名称 BINARY(M) 或 VARBINARY(M),BINARY是固定长度的,不足长度的右边补 ,已达到固定长度。VARBINARY类型的长度是可变的,指定好长度,长度在0到最大值之间。
• 例如:
create table ex13(a BINARY(3),b VARBINARY(3))
insert into ex13 values(5,5)
select LENGTH(a),LENGTH(b)from ex13
显示结果: length(a) length(b)
3 1
# 因为字段a是BINARY类型,不足的空间用‘