MySQL中数据类型扮演者基础但又非常重要的角色。对数据类型的选择将影响上层应用的性能和后期维护的成本。因此,给数据选择正确的类型至关重要。这里,就简单的总结下MySQL中的数据类型。
1 日期和时间类型
MySQL数据库中有五种与日期和时间有关的数据类型,不同的类型在数据库中会占用不同的储存空间。
DATETIME | 8字节 |
DATE | 3字节 |
TIMESTAMP | 4字节 |
YEAR | 1字节 |
TIME | 3字节 |
DATETIME 是最为详细的数据类型,可以记录日期和精确到秒的时间,记录的时间长度可以从1000-01-01 00:00:00到9999-12-31 23:59:59之间的时间。在数据库中输入的标准格式为:YYYY-MM-DD HH:MM:SS。但是其他的形式如:2011/01/01 00+01+10,或者 20110101000110 等都可以。
具体用法如下:
DATE 只能记录当前的时间,格式与DATETIME 相似。
RIMESTAMP 的形式与DATETIME相同,只是记录的时间段较短,只能记录从1970-01-01 00:00:00 到2038-01-19 03:14:07之间的时间,所以占用的空间也较少。
YEAR 和 TIME 分别用来记录年份和时间,用法和TIMEDATE中相应的部分相同。
对于可以记录时间的三个变量 TIME DATETIME TIMESTAMP ,MySQL5.6.4版本后开始支持对秒的小树部分。具体语法为: type_name(fsp) type_name是相应的变量类型,fsp表示支持秒的精度,最大为6.。
2 数字类型
最为常用的整型变量
数据类型 | 占用空间(字节) | 范围 |
TINYINT | 1 | -128~127 |
SMALLINT | 2 | -32768~32767 |
MEDIUMINT | 3 | -8388608~8388607 |
INT | 4 | 略 |
BIGINT | 8 | 略 |
关于整型数,有一点就是以前总是认为在int后面加长度可以对int的范围进行限制,但其实int(9)这样的书写其实并没有实质性的意义。
从上面的图就可以看出,虽然规定了int的长度为1 ,但是依然可以添加 数字11。所以后面的长度其实更多的是起到提示作用,如果要限定int的插入类型的长度,还得通过程序进行约束。
3 浮点型(非精确类型)
MySQL支持两种浮点型数据类型:单精度的FLOAT 和双精度的 DOUBLE PRECISION(写成DOUBLE也可以)。FOALT 是单精度的变量,占用的空间为4个字节,而DOUBLE PRECISION是双精度变量,占用8个字节的空间。另外,MySQL支持非标准语法:FLOAT(M,D)或者REAL(M,D)或DOUBLE PRECISION(M,D),M表示该值一共的位数,D表示小数点后面的位数。如果小数点超出定义的位数,mysql在储存是会进行四舍五入。
4 高精度类型
DECIMAL 和 NUMERIC 是MySQL中的高精度类型,且两种变量被视为同一种类型。高精度的类型在使用时和浮点型相似,同样支持非标准语法。但和浮点型不同的是,DECIMAL 和 NUMERIC 在保存时并不会完全保存数据的内容,而浮点型则是采用近似的方式保存,因而DECIMAL 和NUMERIC 更为精确。
5 char 和 varchar
这两种是用来储存字符的数据类型。一般来说,char是用来保存固定长度的字符串,而varchar是用来保存变长字符类型。
对于char类型,定义时CHAR(N) 中的N 的范围为0~255。在进行存储时,如果存入的字符串长度不到N,mysql会自动在右侧用‘ ’进行补齐。所以说char是用来储存固定长度的字符的数据类型。
对于varchar类型,定义时VARCHAR(N)中的范围为0~65535。在进行存储是,会在右侧前缀字符串的实际长度,而不是在右侧进行补齐。因而,在某些情况下,varchar(10)占用的储存空间可能会是11个字符的长度,也可能会小于10,而char(10)则一定是10个字符的长度。
关于char和varchar,最后需要记住的是,不管是VARCHAR(N)还是CHAR(N)中的N都是字符的长度,而不是占用空间的大小。比如在utf8中,一个字符占用的空间为3个字节,所以CHAR(10)占用的空间实际为30个字节大小。但是在big5中,一个字符的大小为2bit,所以CHAR(10)占用的空间就是20。
6 BINARY 和 VARBINARY
BINARY 和 VARBINARY 与CHAR 和 VARCHAR 的用法基本相同,不同的是定义时BINARY(N)和VARBINARY(N)中的N是字节长度,而不是字符长度。所以如果剩余的空间不到插入的字符的大小,则会进行截取,值存入前面的部分。比如定义BINARY(1) 但是存入了'中'(假设字符集为utf8),因为‘中’会占用3个字节,所以并不能全部存,只会存入第一个字节的信息。
7 BLOB 和 TEXT
这两种数据类型是MySQL专门用来储存大数据的数据类型。
其中 BLOB 是二进制储存,相当于大数据的BINARY ,TEXT 是字符类型,相当于大数据的VARCHAR。
InnoDB储存引擎在这两种类型进行储存时,并不会全部放入数据表中,只会储存前20个字符作为索引。其他的部分将储存在行溢出页中。
排序的时候也是一样,并不会比较全部的内容,只会比较前1024个字节的长度(可以通过max-sort-length进行设置,默认值为1024)。
8 MENU 和 SET 类型
这两个是MySQL中的集合类型,通常用来进行枚举。ENUM 可以枚举65536个元素,而SET最多枚举64个元素。
由于MySQL并不支持传统的CHECK约束,所以通过ENUM和SET 可以解决一部分问题。比如定义性别时只能有两个选择,就可以通过ENUM和SET 进行约束。