数据类型
2021年9月11日大约 3 分钟
1. 数值类型
1.1 整型
(1)分类
整数类型 | 字节 | 范围 |
---|---|---|
tinyint | 1 | 有符号:-128~127 无符号:0~255 |
smallint | 2 | 有符号:-32768~32767 无符号:0~65535 |
mediumint | 3 | 有符号:-8388608~8388607 无符号:0~1677215 |
int / integer | 4 | 有符号:- 2147483648~2147483647 无符号:0~4294967295 |
bigint | 8 | 有符号:-9223372036854775808~9223372036854775807 无符号:0~9223372036854775807*2+1 |
(2)特点
- 如果不设置整型无符号还是有符号,默认是有符号,如需设置无符号,需要添加 UNSIGNED 关键字
- 如果插入的数值超出了整型的范围,会报 out of range 异常,并且会往相应字段插入临界值
- 如果不设置长度,会有默认的长度,长度代表的是显示的最大宽度,如果不够会用 0 在左侧填充,但前提是搭配上 ZEROFILL 使用
1.2 小数
(1)分类
浮点数类型 | 字节 | 范围 |
---|---|---|
float | 4 | ±1.75494351E-38~±3.402823466E+38 |
double | 8 | ±2.2250738585072014E-308~ ±1.7976931348623157E+308 |
定点数类型 | 字节 | 范围 |
---|---|---|
DEC(M,D) / DECIMAL(M,D) | M+2 | 最大取值范围与 double 相同,给定 decimal 的有效取值范围由 M 和 D 决定 |
(2)关于(M , D) 的用法说明
- M:整数部分 + 小数部分 的位数 D:小数部分 的位数
- 如果超过范围,则插入临界值
- M 和 D 都可以省略
- 如果是 DECIMAL,则 M 默认为10,D 默认为 0
- 如果是 float 和 double,则会根据插入的数值的精度来决定精度
- 定点型的精确度较高,如果要求插入数值的精确度较高如 货币运算 等则考虑使用定点型
1.3 关于数值类型的选取原则
所选择的类型越简单越好,能保存数值的类型越小越好
2. 字符类型
2.1 保存较短的文本
①char ②varchar
字符串类型 | 最多字符数 | 描述及存储要求 |
---|---|---|
char(M) | M | M 为 0~255 之间的整数 |
varchar(M) | M | M 为 0~65535 之间的整数 |
二者区别:
类型 | 写法 | M 的意思 | 特点 | 空间的耗费 | 效率 |
---|---|---|---|---|---|
char | char(M) | 最大的字符数,可以省略,默认为1 | 固定长度的字符 | 比较耗费 | 高 |
varchar | varchar(M) | 最大的字符数,不可以省略 | 可变长度的字符 | 比较节省 | 低 |
2.2 保存较长的文本
①text ②blob(较大的二进制)
2.3 其他
①Enum类型
说明:又称为枚举类型,要求插入的值必须属于列表中指定的值之一
如果列表成员为 1~255,则需要 1 个字节存储,如果列表成员为 255~65535,则需要 2 个字节存储,最多需要65535 个成员!
示例
CREATE TABLE tab_enum( e1 ENUM('a','b','c') ); INSERT INTO tab_enum VALUES('a');# 插入成功 INSERT INTO tab_enum VALUES('b');# 插入成功 INSERT INTO tab_enum VALUES('c');# 插入成功 INSERT INTO tab_enum VALUES('d');# 插入失败 INSERT INTO tab_enum VALUES('A');# 插入成功
结果:
②Set类型
说明:和 Enum 类型类似,里面可以保存 0~64 个成员,和 Enum 最大的区别是:Set 类型一次可以选取多个成员,而 Enum 只能选一个
根据成员个数不同,存储所占的字节也不同
成员数 字节数 1~8 1 9~16 2 17~24 3 25~32 4 33~64 8
示例
CREATE TABLE tab_set( s1 SET('a','b','c','d','e') ); INSERT INTO tab_set VALUES('a,b,c');
结果:
③binary 和 varbinary 用于保存较短的二进制(了解即可)
3. 日期类型
3.1 分类
主要关注 datetime 和 timestamp
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
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 |
3.2 datetime 和 timestamp 的区别
- timestamp 支持的时间范围较小
- timestamp 和实际时区有关,更能反映实际的日期,而 datetime 则只能反映出插入时的当地时区
- timestamp 的属性受 MySQL 版本和 SQLMode 的影响很大