共计 913 个字符,预计需要花费 3 分钟才能阅读完成。
整数类型:
Tinyint-8
Smallint-16
Mediumint-24
Int-32
Bigint-64
实数类型(带有小数部分的数字)
Float-4/double-8:浮点
Decimal:精确(只是存储格式,在计算中会转为 double 类型)
浮点类型在存储同样范围的值时,通常比 decimal 使用更少的空间。
字符串类型:
Varchar:可变长字符串(需要 1 - 2 个字节存储字符串长度)
优点:比定长类型节约空间;
缺点:碎片问题。字符串 update 变长时,一个行的占用空间变长,但是在页内没有更多空间存储,MYISAM 将行拆成不同片段存储,InnoDB 分裂页使行可以放进页内;
适用:字符串最大长度比平均长度大很多;列的更新很少;
Char:定长字符串(MySQL 会删除所有末尾空格)
优点:不易产生碎片
适用:存储密码的 MD5 值;经常变更的数据;
大型数据类型:
Blob:二进制
Text:字符
特殊性:mysql 将 blob 和 text 值当做一个独立的对象处理,当值太大时,innodb 在值内存储一个指针,外部存储区域存储实际的值;mysql 对 blob 和 text 的排序,只对每列的最前 max_sort_length 进行排序;mysql 不能将列的全部长度字符串进行索引,也不能使用这些索引进行排序;
枚举类型 ENUM:
mysql 在存储枚举类型时非常紧凑;
Mysql 在内部会将每个值在列表中的位置保存为整数,并且在表的.frm 文件中保存“数字 - 字符串”的映射关系的查找表;
缺点:字符串列表是固定的,添加或删除字符串都需要 alter table;
优点:可以缩小表的大小;主键减小后,innodb 表的非主键索引也会变小;
关联速度:enum 列 关联 enum 列 > varchar 列 关联 varchar 列 > enum 列 关联 varchar 列
日期时间类型:
Datetime:8 字节;与时区无关;保存大范围的值,从 1001 年到 9999 年,精度为秒;
Timestamp(尽量使用):4 字节;依赖于时区;保存 1970.1.1 以来的秒数;列默认为 not null;
Timestamp 的特殊性:如果插入数据时没有指定第一个 timestamp 列的值,mysql 则设置这个值为当前时间;