深色模式
MySQL 数据类型
整型
| 数据类型 | 字节数 | 带符号最小值 | 带符号最大值 | 不带符号最小值 | 不带符号最大值 |
|---|---|---|---|---|---|
TINYINT | 1 | -128 | 127 | 0 | 255 |
SMALLINT | 2 | -32768 | 32767 | 0 | 65535 |
MEDIUMINT | 3 | -8388608 | 8388607 | 0 | 16777215 |
INT | 4 | -2147483648 | 2147483647 | 0 | 4294967295 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 | 0 | 18446744073709551616 |
整型(N)形式
这种形式的写法基本没有什么用。
int(N) 我们只需要记住两点:
- 无论 N 等于多少,
int永远占 4 个字节 - N 表示的是显示宽度,不足的用 0 补足,超过的无视长度而直接显示整个数字,但这要整型设置了
unsigned zerofill才有效
浮点型
整型之后,下面是浮点型,在 MySQL 中浮点型有两种,分别为 float、double,用一张表格总结一下:
| 数据类型 | 字节数 | 备注 |
|---|---|---|
float | 4 | 单精度浮点型 |
double | 8 | 双精度浮点型 |
总结一下 float(M,D)、double(M,D) 的用法规则:
- D 表示浮点型数据小数点之后的精度,假如超过 D 位则四舍五入,即 1.233 四舍五入为 1.23,1.237 四舍五入为 1.24
- M 表示浮点型数据总共的位数,M=5,D=2,则表示总共支持五位,即小数点前只支持三位数,所以我们并没有看到 1000.23、10000.233、100000.233 这三条数据的插入,因为插入都报错了
当我们不指定 M、D 的时候,会按照实际的精度来处理。
定点型
看到 float、double 类型存在精度丢失问题,即写入数据库的数据未必是插入数据库的数据,而 decimal 无论写入数据中的数据是多少,都不会存在精度丢失问题,这就是我们要引入 decimal 类型的原因,decimal 类型常见于银行系统、互联网金融系统等对小数点后的数字比较敏感的系统中。
最后讲一下 decimal 和 float/double 的区别,个人总结主要体现在两点上:
float/double在 db 中存储的是近似值,而decimal则是以字符串形式进行保存的decimal(M,D)的规则和float/double相同,但区别在float/double在不指定 M、D 时默认按照实际精度来处理而decimal在不指定 M、D 时默认为decimal(10, 0)
日期类型
接着我们看一下 MySQL 中的日期类型,MySQL 支持五种形式的日期类型:date、time、year、datetime、timestamp,用一张表格总结一下这五种日期类型:
| 数据类型 | 字节数 | 格式 | 备注 |
|---|---|---|---|
date | 3 | yyyy-MM-dd | 存储日期值 |
time | 3 | HH:mm:ss | 存储时分秒 |
year | 1 | yyyy | 存储年 |
datetime | 8 | yyyy-MM-dd HH:mm:ss | 存储日期+时间 |
timestamp | 4 | yyyy-MM-dd HH:mm:ss | 存储日期+时间,可作时间戳 |
char 和 varchar 类型
总结一下:
char是固定长度字符串,其长度范围为 0~255 且与编码方式无关,无论字符实际长度是多少,都会按照指定长度存储,不够的用空格补足;varchar为可变长度字符串,在 utf8 编码的数据库中其长度范围为 0~21844char实际占用的字节数即存储的字符所占用的字节数,varchar实际占用的字节数为存储的字符+1 或+2 或+3- MySQL 处理
char类型数据时会将结尾的所有空格处理掉而varchar类型数据则不会
varchar、text 和 blob
最后讲一讲 text 和 blob 两种数据类型,它们的设计初衷是为了存储大数据使用的,因为之前说了,MySQL 单行最大数据量为 64K。
先说一下 text,text 和 varchar 是一组既有区别又有联系的数据类型,其联系在于当 varchar(M) 的 M 大于某些数值时,varchar 会自动转为 text:
- M>255 时转为
tinytext - M>500 时转为
text - M>20000 时转为
mediumtext
所以过大的内容 varchar 和 text 没有区别,同时 varchar(M) 和 text 的区别在于:
- 单行 64K 即 65535 字节的空间,
varchar只能用 63352/65533 个字节,但是text可以 65535 个字节全部用起来 text可以指定text(M),但是 M 无论等于多少都没有影响text不允许有默认值,varchar允许有默认值
varchar 和 text 两种数据类型,使用建议是能用 varchar 就用 varchar 而不用 text(存储效率高),varchar(M) 的 M 有长度限制,之前说过,如果大于限制,可以使用 mediumtext(16M)或者 longtext(4G)。
至于 text 和 blob,简单过一下就是 text 存储的是字符串而 blob 存储的是二进制字符串,简单说 blob 是用于存储例如图片、音视频这种文件的二进制数据的。
