MySQL列类型详解
- 数值型
- 整型
- 浮点型/定点型
- 字符型
- 日期时间类型(插入时需加引号)
在MySQL中,所谓建表就是声明列的过程。数据是以文件的形式放在硬盘上,也有放在内存里的,不同的列所占的空间不同。选择列的原则是够用且不浪费。
数值型
整型
整型包括5种列类型:tinyint、smallint、mediumint、int、bigint。
占据空间和存储范围
类型 | 字节 | 位 | 无符号 | 有符号 |
tinyint | 1 | 8 | 0~(2^8-1) | -2^7~ +(2^7-1) |
smallint | 2 | 16 | 0~(2^16-1) | -2^15~ +(2^15-1) |
mediumint | 3 | 24 | 0~(2^24-1) | -2^23~ +(2^23-1) |
int | 4 | 32 | 0~(2^32-1) | -2^31~ +(2^31-1) |
bigint | 8 | 64 | 0~(2^64-1) | -2^63~ +(2^63-1) |
以tinyint为例,在硬盘上占据1个字节(8位)的空间,无符号存储范围为2^8-1,如果表示负数,可以用最高位来标志符号位。 -2^7~+(2^7-1)(只有后7位表示绝对值,最高位表示的是符号位)(补码)
tinyint默认是有符号的,存储是-2^7~+(2^7-1)
整数列的可选属性tinyint(M) unsigned zerofill;M:宽度(在0填充的时候才有意义)、unsigned:无符号类型(非负)、zerofill:0填充(默认无符号);如果某列定义为zerofill,默认就是unsigned。
浮点型/定点型
浮点型:float(M,D)
定点型:decimal(M,D)
M:精度(总位数,不包含小数点),D:标度(小数位),float(6,2)为例,能存储-9999.99~9999.99范围内的数字,可取值范围与整形不同,比较特殊。float(4,2)取值范围:-99.99~99.99,float(4,2) unsigned 取值范围:0.00~99.99。
字符型
占据空间和存储范围
类型 | 说明 | 典型声明方式 | 范围 |
char | 定长字符串 | gender char(1) | char(M),M取值范围0~2^8-1 |
varchar | 变长字符串 | email varchar(20) | varchar(M),M取值范围0~2^16-1,约2W~6W字符受字符集影响 |
text++ | 文本串 | content text | 约2W~6W字符受字符集影响 |
char定长,char(M),M代表宽度,即可容纳的字符数。
varchar变长,varchar(M),M代表宽度,即可容纳的字符数。
区别:
空间利用效率上:
char定长M个字符,如果存的小于M个字符,实占M个字符,若不够M个字符内部用空格补齐,读时空格丢失;varchar:变长,M个字符,存的小于M个字符,设为N,N<=M,实占N个字符。
运算速度上:定长速度快些。
char与varchar的选择综合空间利用效率和运算速度两方面考虑。
日期时间类型(插入时需加引号)
占据空间和存储范围
类型 | 范围 |
year(年) | 1901~2155,如果输入两位,'00~69’表示2000~2069年,'70~00’表示1970~1999年 |
date(年-月-日) | 1000-01-01~9999-12-31(公元) |
time(时间点) | -838:59:59~+838:59:59 |
datetime(年-月-日 时:分:秒) | 1000-01-01 00:00:00~9999-12-31 23:59:59(公元) |
很少用日期时间类型来表示一个需要精确到秒的列,因为虽然日期时间类型能精确到秒而且方便查看,但计算不便。可以用时间戳来表示一个精确到秒的列,时间戳用int来存储,是1970-01-01 00:00:00到当前的秒数。
比如,一般存注册时间商品发布时间等,并不是用datetime存储,而是时间戳,因为datetime虽然直观,但计算不便,而用int存储时间戳,方便计算,对于显示来说,也方便格式化。