整数类型
类型 |
字节数 |
tinyint |
8 |
smallint |
16 |
mediumint |
24 |
int |
32 |
bigint |
64 |
- mysql在整数计算时使用的是64位的进行计算的,当然除了一些聚合使用decimal和double。
- mysql可以指定整数的宽度,并不会影响存储,只会规定了mysql的交互工具的显示字符的数量。
实数类型
类型 |
字节数 |
float |
4 |
double |
8 |
decimal |
- |
- float和double都是不精确存储的,而decimal是精确存储的,decimal(p, d) p表示精度,也就是数字的总个数,d表示小数精度,也就小数位有多少位,p的范围是 [1, 65],d的范围是[0, 30]。
- decimal只是用来存储,不参加计算,在计算时会转成double进行计算。
字符串类型
- varchar:用于存储变长的字符串。它比定长的char类型更加节省空间,除非表中使用
ROW_FORMAT=FIXED
创建,表示每行都使用室长存储,这就会浪费空间。varchar如果列的最长长度小于255字节,则使用1个字节来存储长度,否则使用2个字节来存储长度。mysql5.0以后,如果varchar过长会被存储为blob类型。
- char:用户存储定长的字符串。每个字符串占用的空间是固定长度的,在取数据时,每个字符串末尾的空格会被删除。在定长来说,他比varchar更节约空间,因为varchar需要额外的字节来存储长度。
- binary和varbinary是用来存储二进制字符串的。
- blob和text:是为了存储很大数据的字符串,分别采用二进制和字符方式进行存储。当blob和text过大时,InnoDB会使用专门的外部区域来进行存储,此时行内存储的外部地址的指针。blob和text相比存储的是二进制数据,没有排序规则和字符集,其他的和text一样。mysql对blob和text进行排序进,并不是全文进行排序,而是只取前一小部分字符进行排序,可能通过
max_sort_length
进行配置,或者在排序时指定长度order by substring(column, 1, length)
。
枚举类型
- mysql在存储枚举类型时会非常紧凑,并且在内部会把每个值在列表的位置保存成整数,并且在表.frm文件中保存“数字-字符串”的映射关系。使用枚举不但能够节省空间还能够在表关联时节省时间,缺点就是需要在创建表时将所有的枚举类型添加进行去,否则多一种枚举类型就需要修改表的字段
alter table
。创建枚举表的sql如下:
create table enum_table(
e enum('B', 'A', 'C') not null
);
insert into enum_table values('B'), ('A');
日期和时间类型
- mysql能存储的最小时间粒度为秒,当然也可以临时使用微秒进行计算。
- datetime:能够保存大范围的值,从1001年到9999年,精度为秒,使用8个字节,它把时间封装到
YYYYMMDDHHmmSS
中去,与时区无关。
- timestamp:它保存了从1970年1月1日午夜(格林尼治标准时间)以来的秒数,它和unix时间戳相同,它只使用4个字节,效率比datetime高,所以它的保存范围比较小,从1970年到2038年。mysql提供
from_unixtime
和from_timestamp
进行相互转化。
位数据类型
- bit:位数据类型,最多能够支持64位,bit可以用来存储true/false的值,每一个值占一个bit,用几个bit占用几个bit,在myisam在处理bit列时会直接打包占用的位数,比如只使用了10位,那么就只用两个字节就可以存储。其他存储类型像InnoDB把它作为tinyint来处理。mysql把bit当作字符串而不是数字,所以当检索bit(1)时,拿到的是二进制的0或1字符串,而不是ascii码的0或1。然而在数字上下文中,它是把位字符串转化成了数字。所以使用时要尤其注意,尽量也不要使用了。如果只是想用来作true/false可以使用char(0)的方式,通过null值和空字符串来做真假值。
- set:多个true/false可以使用set。