1. 常见数据类型
- 数值型
- 整型
- 小数
- 定点数
- 浮点数
- 字符型
- 较短的文本
- char
- varchar
- 较长的文本
- text
- blob
- 日期型
2. 整型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2字节 | (-32 768,32 767) | (0,65535) | 大整数值 |
MEDIUMINT | 3字节 | (-8 388 608,8 388 607) | (0,16777215) | 大整数值 |
INT或INTEGER | 4字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
所以对于整型(N)这种形式,我们只要明白两点:
- 无论 N 是多少和该类型所占字节数无关
- N 表示的是显示宽度,不足的用 0 补足,超过的无视长度而直接显示整个数字,但这要整型设置了 unsigned zerofill 才有效
- 创建时可以不指定N,默认是11
前面填充0,需要怎么弄?无符号+zerofill
create table boo
(
i int unsigned zerofill
);
insert into boo
values (11);
select *
from boo;
3. 小数
1、浮点型:float(M,D)、double(M,D)
2、定点型:dec(M,D)、decimal(M,D)
1、M,D都可以省略,M代表整数位+小数位长度,D代表小数点后D位,
注意:float和double如果D超出了,插入没问题(但是精度有问题);
如果decimal超出了,插入时不能成功的;
4. 字符型
char和varchar
字符串类型 | 最多字符数 | 描述 |
---|---|---|
char(M) | M | M为0-22之间的整数 |
varchar(M) | M | M为0-65535之间的整数 |
varchar为可变字符,也即:占用空间为你实际插入的字符的空间,最大为M;
binary和varbinary,和char类似,只不过是保存二进制数据;
5. Enum类型
插入的值只能是创建时中指定的值之一;
create table tab_d
(
c1 enum ('a','b','c')
);
6. Set类型
和枚举类型Enum类似,只不过可多个:
create table tab_s
(
c1 set ('a','b','c','d')
);
insert into tab_s
values ('a,b,c');
select *
from tab_s;
注意:Enum和Set都不区分大小写;
7. 日期型
mysql五种数据类型如下:
类型 | 所占空间 |
---|---|
DATETIME | 8Byte |
DATE | 3Byte |
TIMESTAMP | 4Byte |
YEAR | 1Byte |
TIME | 3Byte |
DATETIME 和 DATE:
类型 | 范围 |
---|---|
DATETIME | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
DATE | 1000-01-01 ~ 9999-12-31 |
其基本格式为YYYY-MM-DD HH:MM:SS
但是数据库对于时间的限制十分宽松,很多别的写法也可以;
TIMESTAMP和DATETIME
timestamp
的结果和datetime
是一样的,但是timestamp
占4Byte,范围为: 1970-01-01 00:00:00 ~ 2038-01-19 03:14:07
它保存的是这个时间距离1970-01-01 00:00:00
的毫秒数。
Timestamp
和datetime
还有些区别:
- 在建表时,
Timestamp
可以为日期设置一个默认值,而datetime
不行; - 在更新表时,
Timestamp
可以设置为自动更新时间为当前时间。
写法如下:
create table test2(
pid int primary key auto_increment,
uptime timestamp null default current_timestamp on update current_timestamp,
hobby varchar(30)
);
但是在首次插入时,uptime
依然没有时间,因为上面我们设置可以为null
,所以:
create table test2(
uptime timestamp not null default current_timestamp on update current_timestamp,
);
YEAR 和 TIME
YEAR占一个字节,范围为 1901 ~ 2155
TIME占三个字节,范围为 -838:59:59 ~ 838:59:59
可以看到TIME类型不仅小时数可以大于23,甚至可以保存负数,这是因为TIME不仅仅可以保存一天的时间,还可以用来保存时间间隔。
TIME和DATETIME一样,可以显示微秒时间,只是插入时同样会被截断。