在数据库中,数据类型对于设计数据库者来说十分重要,记得在一次数据库大会上,某前辈说了这么一句话:“如果是我面试DBA,我第一个问题就是关于tinyint、smallint、mediumint、int、bigint的区别,如果这些不能详细解释,后面不管他表现的多好,我不会考虑”,从这里可以理解掉MySQL的数据类型是多么重要,很多人特别是开发人员往往不会关注这方面,从理解上大家会任务数据库对内存等方面要求很高,这些数据类型并不是很重要,其实他忽略了一个关键的因素,磁盘IO,如果数据类型设置的不合理,会占用很大的磁盘空间,会给数据带来IO上得瓶颈,下面我们就详细的学习下MySQL支持的数据类型
1:数值类型
整数类型
字节
最小值
最大值
TINYINT
1
有符号-128
无符号0
有符号127
无符号255
SMLLINT
2
有符号-32768
无符号0
有符号32767
无符号65535
MEDIUMINT
3
有符号-8388608
无符号0
有符号8388607
无符号16777215
INT、INTEGER
4
有符号-2147483748
无符号0
有符号2147483747
无符号4294967295
BIGINT
8
有符号-9223372036854775808
无符号0
有符号9223372036854775807
无符号18446744073709551615
浮点数类型
字节
最小值
最大值
FLOAT
4
+_1.17549435-38
+_3.402823466E+38
DOUBLE
8
+_2.225073858507204E-308
+_1.7976931348623157E+308
在整数类型着中,按照取值范围和存储方式不同,分为tinyint、smallint、 mediumint、int、bigint这5个类型,如果超出类型范围的操纵,会发生“out of range”错误提示。为了避免此类问题发生,在选择数据类型时要根据应用的实际请客确定其取值范围,最后根据确定的结果慎重选择数据类型
所有的整数类型都有一个可选属性UNSIGNED(无符号),如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,他的取值范围是正常值的下限取0,上限取原值的2倍
另外,整数类型还有一个属性,AUTO_IMCREMENT。在需要产生唯一标示符或顺序值时,可利用此属性,这个属性只用于整数类型,AUTO_INCREMENT值一般从1开始,每行加1
2:日期时间类型
MySQL中友很多种数据类型可以用于日期和时间的表示,不同的版本可能有所差异,下表列出5.0所支持的日期和时间类型
日期和时间类型
字节
最小值
最大值
DATE
4
1000-01-01
9999-12-31
DATETIME
8
1000-01-01 00:00:00
9999-12-31 23:59:59
TIMESTAMP
4
19700101080001
2038年的某个时刻
TIME
3
-838:59:59
838:59:59
YEAR
1
1901
2155
上述类型,除了TIMESTAMP外都容易理解,下面我们就TIMESTAMP和DATETIME进行对比
1:TIMESTAMP支持的时间范围小,其取值范围从19700101080001到2038年的某个时刻,而DATETIME是从1000-01-01 00:00:00到9999-12-31 23:59:59,范围更大
2:表中的第一个TIMESTAMP列自动设置为系统时间,如果在一个TIMESTAMP中插入NULL,则该列赋值将自动设置为当前的日期和时间,再插入或者更新一行但不明确给TIMESTAMP列赋值时也会子偶那个设置该列的当前的时间和日期,当插入的值超出取值范围,MySQL认为该值溢出,使用“0000-00-00 00:00:00”进行填补
3:TIMESTAMP的插入和查询都受当地时区的影响,更能反应出实际的日期。而DATETIME则只能反应出插入时当地的时区,其他时区的人查看数据必然会受到影响
4:TIMESTAMP的属性受MySQL版本和服务器SQLMode的影响很大
3:字符串类型
MySQL提供了很多种对字符数据的存储类型,下表就详细进行了对比
字符串类型
字节
描述及存储需求
CHAR(M)
M
M为0~255之间的整数
VARCHAR(M)
M为0~65535之间的整数,值的长度+1个字节
TINYBLOB
允许长度0~255字节,值的长度+1个字节
BLOB
允许长度0~65535字节,值的长度+2个字节
MEDIUMBLOB
允许长度0~167772150,值的长度+3个字节
LONGBLOB
允许长度0~4294967395,值的长度+4个字节
TINYTEXT
允许长度0~255,值的长度+2个字节
TEXT
允许长度0~65535字节,值的长度+2个字节
MEDIUMTEXT
允许长度0~167772150,值的长度+3个字节
LONGTEXT
允许长度0~4294967395,值的长度+4个字节
VARBINARY( M)
允许长度0~M个字节的变长字符串,值的长度+1个字节
BINARY(M)
M
允许长度0~M个字节的变长字符串
CHAR和VARCHAR类型
CHAR和VARCHAR很类似,都用来保存MySQL中较短的字符串,二者的主要区别在于存储方式的不同,CHAR列的长度固定为创建表时的长度,长度可以为从0~255任何值。而VARCHAR列中的值为可变长字符串,长度可以为指定的0~255或者65535之间的值。在检索的时候,CHAR列删除了尾部的空格,而VARCHAR保留了这些空格。会造成索引存储大小上的变化,所以在设置这个类型的时候一定要慎重,充分分析现有业务
BINARY和VARBINARY类型
BINARY和VARBINARY类似于CHAR和VARCHAR,不同的是它们包含二进制串而不包含非二进制字符串。
TEXT和BOLB类型
这2种主要用于存储一些大字段类似于图片等,慎用……