要了解 MySQL 数据库,首先必需要了解 MySQL 支持的数据类型。实际上,MySQL 支持不少数据类型,包括整数类型、实数类型、字符串类型、枚举类型、时间类型等。mysql
原文地址:服务端指南 数据存储篇 | MySQL(01) 数据类型的使用与选择
博客地址:blog.720ui.com/sql
对于整数类型,可使用 TINYINT、 SMALLINT、 MEDIUMINT、 INT、 BIGINT 等。每一个整数类型都对应着不一样的存储空间。数据库
数据类型 | 存储(Bytes) |
---|---|
TINYINT | 1 |
SMALLINT | 2 |
MEDIUMINT | 3 |
INT | 4 |
BIGINT | 8 |
当使用整数类型时,存在一些使用细节,这里,给读者进行说明。数组
整数类型能够选择 UNSIGNED 属性,表示不容许负数,这样可使得正数的上限提升一倍。举个例子,INT 的存储范围是 -2-31 ~ 231 - 1,也就是 -2147483648 ~ 2147483647,那么 UNSIGNED INT 能够存储的范围就是 0 ~ 263 - 1,即 0 ~ 9223372036854775807。微信
整数类型能够指定宽度,然而对大多数场景是没有意义的,它并不会限制整数类型的合法范围,它只是规定某些交互工具显示出来的字符个数。若是不显示地指定宽度,则默认为 INT(11)。有读者会误认为 INT(11) 指定整数类型的长度是 11 位,这个想法是错误的。实际上,在 Zerofill 属性中,表示当数组宽度小于 11 位时,在数字前面加 0 填满宽度。工具
更小的数据类型一般更快,由于占用更少的磁盘空间。举个例子,若是须要存储性别状态(1-男;2-女;99-未知),这个时候应该优先考虑 TINYINT,而不是 INT,由于 TINYINT 占用更少的磁盘空间。所以,须要选择合适的整数类型来减小占用的磁盘空间,而不是选择所有使用 INT 或 BIGINT。大数据
对于实数类型,可使用 FLOAT、 DOUBLE、 DECIMAL 等。每一个实数类型都对应着不一样的存储空间。ui
数据类型 | 存储(Bytes) |
---|---|
FLOAT | 4 |
DOUBLE | 8 |
FLOAT(M,D) 和 DOUBLE(M,D) 表示一共显示 M 位整数,D 位小数。举个例子,FLOAT(5,2) 能够显示为 100.99。此外,读者还要注意的是,MySQL 保存时会进行四舍五入,所以,若是值为 100.0099, 会保存近似结果 100.01。cdn
FLOAT 只保证 6 位有效数字的准确性,因此 FLOAT(M,D) 中,M<=6 时,数字一般是准确的。blog
DOUBLE 只保证 16 位有效数字的准确性,因此 DOUBLE(M,D) 中,M<=16 时,数字一般是准确的。
在使用实数类型,要重点考虑精度问题。DOUBLE 是 MySQL 内部浮点计算的类型,它比 FLOAT 有更高的精度和更大的范围,可是 FLOAT 和 DOUBLE 都是不精确的,若是要实现精确浮点运算,就须要使用 DECIMAL 类型。
所以,若是须要考虑精度问题,优先考虑 DECIMAL 类型。若是对精度问题不是特别敏感,能够考虑使用 FLOAT 或者 DOUBLE 类型。
对于实数类型,可使用 CHAR、 VARCHAR、 BLOB、 TEXT 等。
CHAR 类型是定长的。MySQL 会根据定义的长度分配空间。CHAR 长度能够是 0 到 255之间的值。
VARCHAR 类型用于存储可变长字符串,它更加节省空间。值得注意的是, VARCHAR 实际上会使用 1 或 2 个额外字节记录字符串的长度。VARCHAR 长度能够指定 0 到 65535 之间的值。
BLOB 和 TEXT 主要用来存储大文本,分别采用二进制和字符串方式存储。若是 BLOB 和 TEXT 还没法知足需求,还可使用 TINYBLOB、 MEDIUMBLOB、 LONGBLOB、 TINYTEXT、 MEDIUMTEXT、 LONGTEXT。值得注意的是,它们不可以有默认值。
对于字符串类型的使用场景,能够大概总结下。
定长的字符串,能够选择 CHAR。举个例子,身份证是定长类型,那么选择 CHAR 是很是合适的。
变长的字符串,能够选择 VARCHAR, 由于 VARCHAR 更加节省空间。
存储大文本的场景,能够考虑使用 BLOB 和 TEXT。若是 BLOB 和 TEXT 还没法知足需求,还可使用 TINYBLOB、 MEDIUMBLOB、 LONGBLOB、 TINYTEXT、 MEDIUMTEXT、 LONGTEXT。
实际上, 枚举类型保存的是整数类型,但其显示为字符串。若是将一个非法值插入,即容许的值以外的字符串,枚举类型将不容许操做,可是枚举类型容许空字符串和 NULL 类型。
尽可能不要使用枚举类型,由于枚举类型增长了维护成本。试想,若是须要增长新的枚举类型,须要全表更新,若是对于大数据量的更新场景,会形成锁表,这是多么恐怖的事情。
对于时间类型,MySQL 提供了丰富的数据类型: YEAR、 DATE、 TIME、 DATETIME、 TIMESTAMP。每一个时间类型都对应着不一样的时间格式。
数据类型 | 时间格式 | 案例 |
---|---|---|
YEAR | 0000 | 2017 |
DATE | 0000-00-00 | 2017-01-01 |
TIME | 00:00:00 | 01:01:01 |
DATETIME | 0000-00-00 00:00:00 | 2017-01-01 01:01:01 |
TIMESTAMP | 0000-00-00 00:00:00 | 2017-01-01 01:01:01 |
MySQL 可以存储的最小单位是秒,若是须要更精确的存储,就必须本身定义存储格式。
MySQL 时间类型是存在范围的。
数据类型 | 范围 |
---|---|
DATE | '1000-01-01' ~ '9999-12-31' |
DATETIME | '000-01-01 00:00:00' ~ '9999-12-31 23:59:59' |
TIMESTAMP | '1970-01-01 00:00:01'UTC ~ '2038-01-19 03:14:07' UTC |
DATETIME 和 TIMESTAMP 均可以存储相同类型的数据,而 TIMESTAMP 只使用 DATETIME 一半的存储空间。一般状况下,建议优先考虑 TIMESTAMP,由于它的空间利用率更高。
(完)
更多精彩文章,尽在「服务端思惟」微信公众号!