TINYINT: 1字节
SMALLINT:2字节
MEDIUMINT:3字节
INT:4字节
BIGINT: 8字节
每个可以存储的值范围为 -2(N-1) ~ 2(N-1)- 1,其中N为占的字节数 * 8(也就是占用的位数)
整数类型可以选择使用无符号也就是UNSIGNED,这可以使得上限提升约一倍,例如:TINYINT表示-128-127,然而TINYINT UNSIGNED可以表示0-255
有符号和无符号的性能和存储空间是相同的
FLOAT:4字节
DOUBLE:8字节
与上面两种不同的是Mysql内部自己实现了一种DECIMAL 来表示更高精度的实数
例如:DECIMAL(18,9) 表示一共十八位,其中小数点后面可以表示9位,DECIMAL是Mysql自己内部实现的,运算效率取决于内部实现,而CPU原生支持FLOAT和DOUBLE的运算,通常FLOAT和DOUBLE效率比DECIMAL高
VARCHAR: VARCHAR用于存储可变长度的字符串,往往比定长更省空间,因为在使用上只使用必要的空间,但是需要额外使用1个或者2个字节来表示当前存储的长度,如果列的长度小于等于255个字节,则使用一个字节,否则两个,当然他也有一些不好的情况,例如:因为行是变长的,所以有可能当更新时,剩下的页空间已经不足以放入新的数据,这时候就会产生页分裂,而页分裂又伴随着IO操作,对性能是有损耗的
以下情况适合使用VARCHAR:字符串最大长度比平均长度大很多;列的更新很少;使用了UTF-8这样子的字符集,每个字符间可能都使用不同的字节数存储
CHAR: CHAR类型占用空间是定长的,当插入的数据不够时,在末尾使用空格来填充,所以当填入的数据右边有空格时,mysql会自动删除这些空格,例如存入的数据为“123 ”,我们再使用sql去查询,查询的结果为”123”,CHAR适合存储很短或者所有值都接近同一个长度或者长度为定值的数据,即使是经常变更的数据,因为是定长也不会产生页分裂。
BLOB和TEXT: BLOB和TEXT都是为了存储很大的数据而设计的字符串类型,分别采用二进制和字符方式存储,与其他类型不同,MySQL把每个BLOG和TEXT的值当作一个独立的对象处理,当值太大时,InnoDB会使用专门的外部存储区域来存储,此时在行内存储一个指向外部区域的指针;
DATETIME:格式为YYYYMMDDHHMMSS,它可以保存1001年到9999年,精度为秒
TIMESTAMP:时间戳类型,TIMESTAMP只用了4个字节存储,只能表示1970到2038年
YEAR:存储年份
DATE:存储日期,没有小时分钟和秒,格式可以为YYYY-MM-DD
TIME:存储小时分钟和秒,格式可以为 HH:MM:SS
参考资料:《高性能MySQL》第三版