数值类型
整数
整数类型 | 取值范围 | 存储需求 |
---|---|---|
TinyInt(size) | 有符号:-128 ~ 127; 无符号:0 ~ 255 | 1 字节 |
SmallInt(size) | 有符号:-32768 ~ 32767 无符号:0 ~ 65535 | 2 字节 |
MediumInt(size) | 有符号:-223~223-1 无符号:0~224-1 | 3 字节 |
INT(size) (size 默认为 11) | 有符号:-231~231-1 无符号:0~232-1 | 4 字节 |
BIGINT(size) | 有符号:-263~263-1 无符号:0~264-1 | 8 字节 |
- 默认为有符号,无符号需要设置
unsigned
约束 - 插入的数值 > 类型范 围 → 直接报错
浮点数
小数类型 | 说明 | 存储需求 |
---|---|---|
float(size, d) | ±1.1754351e-38 | 4 字节 |
double(size, d) | ±2.2250738585072014e-308 | 8 字节 |
decimal(size, d) | size 默认为 10,d 默认为 0 | M + 2 个字节 |
size
为精度;d
为保留的小数位数
- 小数部分:if 数据的小数位数 > d → 系统会自动四舍五入
- 整数部分:if 数据的整数位数 > size - d → 报错
id float(5, 2); -- size=5, d=2, 就是说整数最多只能是3位数
- 对于高精度的数值,一般使用
decimal
而不考虑float
、double
,因为后者容易产生误差 decimal
&numeric
同义,decimal
可以简写为dec
字符串
字符串类型 | 说明 | 长度 |
---|---|---|
char(size) (size 默认为1) | 定长字符串 | 0 ~ 255 |
varchar(size) | 变长字符串 | 0 ~ 65535 |
TinyText | 微型文本串 | 0 ~ 255 |
text | 文本串 | 0 ~ 65535 |
char & varchar
char(10)
:即使实际字节数 < 10,还是会占据 10 个字节的存储空间varchar(10)
:实际字节数是多少就是多少,能自动计算你的字节数(由于有计算的操作,速度相对会慢一些)
枚举类型
enum('字段值1', '字段值2');
- 对 1 ~ 255 个成员的枚举需要 1 个字节存储
- 对于 255 ~ 65535 个成员,需要 2 个字节存储
- 最多存储 65535 个成员
注意:在操作字段的时候,枚举类型的字段值可以直接写序号,1 → 字段1、2 → 字段2 …
drop table if exists students;
create table students (
sex enum('f', 'm')
);
insert into students values('m');
insert into students values('F'); -- 不区分大小写
insert into students values(1); -- 1 → f 2 → m
日期类型
日期类型 | 格式 | 取值范围 |
---|---|---|
date | YYYY-MM-DD,日期格式 | 1000-01-01 ~ 9999-12-31 |
time | hh:mm:ss: | -835:59:59 ~ 838:59:59 |
DateTime | YY-MM-DD hh:mm:ss: | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
TimeStamp | YYYYMMDDHHMMSS | 1970年某时刻 ~ 2038年某时刻,精度为 1 秒 |
year | YYYY 格式的年份 | 1901 ~ 2155 |
TimeStamp
支持的时间范围较小(1970-01-01 08:00:01 ~ 2038年的某个时间)
DateTime
的取值范围:1000-1-1 ~ 9999-12-31
TimeStamp
和实际时区有关,更能反映实际的日期
DateTime
只能反映出插入时的当地时区
TimeStamp
的属性受 MySQL 版本和 SQLMode 的影响很大
drop tables if exists `time`;
CREATE TABLE `time` (
`DateTime` datetime,
`TimeStamp` timestamp
);
insert into `time` values(now(), now());
show variables like 'time_zone'; -- 查看当前时区 → SYSTEM → 2021-04-24 19:32:26
set time_zone = '+9:00'; -- 设置时区
select * from `time`;
-- DateTime 2021-04-24 19:32:26
-- TimeStamp 2021-04-24 20:32:26
可以看见 TimeStamp
根据时区的改变而改变了