【MySQL】(3) 数据类型
一、一些概念
同一个东西,在不同领域中有不同的叫法:
定义实体的属性,取名+指定数据类型,本文讲数据库中的数据类型。
二、数值型
类型 | 大小范围 | M/D含义 | M/D范围 | 不足 M | 备注 |
BIT[(M)] | 0 和 1 组成的序列 | 序列的位数 | 1~64,省略默认 1 | 左边填0 | |
TINYINT[(M)] | 1字节,相当于 Byte 类型。 | 显示宽度 | 左边填0,搭配ZEROFILL 使用 | ||
BOLL | 1字节,同TINYINT(1) | ||||
SMALLINT[(M)] | 2字节,相当于 Short 类型。 | 同 TINYINT | 同 TINYINT | ||
MEDIUMINT[(M)] | 3字节 | 同 TINYINT | 同 TINYINT | ||
INT[(M)] | 4字节,相当于 Int 类型。 | 同 TINYINT | 同 TINYINT | ||
INGEGER[(M)] | 4字节,同 INT | 同 TINYINT | 同 TINYINT | ||
BIGINT[(M)] | 8字节,相当于 Long 类型。 | 同 TINYINT | 同 TINYINT | ||
FLOAT[(M, D)] | 4字节,相当于 Float 类型 | M总位数,D小数点后位数 | D最多是7 | 由于精度问题,开发时不用 | |
DOUBLE[(M, D)] | 8字节,相当于 Double 类型 | 同FLOAT | D最多是15 | 由于精度问题,开发时不用 | |
DECIMAL[(M, D)] | 动态,不存在精度损失。相当于BigDecimal | 同FLOAT | M最多64,省略默认10。D最多30,省略默认0。不计小数点、负号。 | 分成多份,每份用 int 存,剩下不足 int 的用最小单位 SMALLINT。 |
真实开发中,存金额这样的小数:
- 用不损失精度的 Decimal,但使用过程麻烦(不能直接跟整数、小数进行混合运算)。
- 把金额换成更小的单位,用 INT 存。
三、字符串类型
类型 | 大小范围 | M/D含义 | M/D范围 | 不足 M | 备注 |
CHAR[(M)] | 相当于字符数组,0~255 | 字符数(认为每个字符 1字节) | 0~255 | 右侧填充空格,省略默认1 | |
VARCHAR(M) | 可变长,0~65535字节 | 最大字符数 | 最常用 | ||
TINYTEXT | 小文本,最大255个字节 | ||||
TEXT | 文本,最大65535个字节 | ||||
MEDIUMTEXT | 中文本,最大16,777,215个字节 | ||||
LONGTEXT | 大文本,最大4,294,967,295个字节 | ||||
BINARY[(M)] | 存二进制,固定长度 | 最大字节 | 0~255 | 默认1 | 不用 |
VARBINARY(M) | 存二进制,可变长度 | 最大字节 | 不用 | ||
TINYBLOB | 小二进制字节 | 最大字节 | 最大255 | 不用 | |
BLOB[(M)] | 二进制字节 | 最大字节 | 最大65535 | 不用 | |
MEDIUMBLOB[(M)] | 中二进制字节 | 最大字节 | 最大16,777,215 | 不用 | |
LONGBLOB | 大二进制字节 | 最大字节 | 最大4,294,967,295 | 不用 | |
ENUM('value1','valu e2',...) | 枚举。从'value1'、'valu e2'...... 或 '' 、NULL 中选一个 | 单个元素最大255字节,最多65535个元素。不用。 | |||
SET('value1','value 2',...) | 集合。从'value1'、'valu e2'中选0个或多个 | 最多64个元素,单个最多255字节。不用。 |
- 保存二进制文件,不用 BINARY 等,而是保存二进制文件在网络空间上的地址。直接保存图片、视频等二进制文件,需要大量存储空间。
- 二进制的列,排序规则以 _bin 结尾,如 utf8mb4_bin。
- char 和 varchar 的区别:取数据时,char 会截去尾部空格;varchar 不会截去尾部空格。char 存储字符串不足 M,右边填充空格;允许M=0,表示 '' 或 NULL。varchar 存储字节数不超过 255,多一个字节记录使用字节长度;超过255,多二个字节存储使用字节长度。因此 varchar 读写效率更低,需要根据记录长度读取。
- varchar 和 text 的区别:最大存储字节都一样,但是 text 不够时,会自动往上转换。varchar 不超过768字节部分保存在当前行,超过768字节部分保存在溢出页,当前行还需保存溢出页地址;text 当前行只保存溢出页,整体存在溢出页。varchar 可以创建索引,查询性能比 text 高。
- SQL语句不是越复杂越好,简单的SQL语句能够几条并行执行,效率更高。
四、日期类型
类型 | 大小 | 说明 |
TIMESTAMP[(fsp)] | 1970-01-01 00:00:01.000000 ~ 2038-01-19 03:14:07.499999 | 不用,2038 年不够 |
DATETIME[(fsp)] | 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999 日期+时间 | fsp 是小数秒,最大为 6,省略默认为 0。 |
DATE | 1000-01-01 ~ 9999-12-31 日期 | |
TIME[(fsp)] | -838:59:59.000000 ~ 838:59:59.000000 时间 | fsp 同上 |
YEAR[(4)] | 1901 ~ 2155 年 |
- CURRENT_DATE 、CURRENT_DATE() 、CURDATE() 获取当前日期。
- CURRENT_TIME 、CURRENT_TIME([fsp]) 、CURTIME() 获取当前时间。
- CURRENT_TIMESTAMP、CURRENT_TIMESTAMP([fsp]) 、NOW() 获取当前的日期+时间。