上一篇主要讲了 MySQL 的简介,这篇主要总结 MySQL 中的数据类型。由于 MySQL 很多特性都是由存储引擎决定的,而自己使用得基本都是 InnoDB,所以,下面都已 InnoDB 为准。
MySQL 中整数类型包括五种,分别是 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
,分别占用8、16、24、32、64位存储空间,同时,所有整数类型都可以是 UNSIGNED
或SIGNED
型,表示是否可以有负数。
在创建数据库的时候,经常指定整数类型的长度,如定义 INT(11)来表示手机号,但多数情况下,长度是没有意义的,不会限制数值的合法范围,数值的合法范围仍由占的存储空间决定,长度只是规定了 MySQL 的一些交互工具显示字符的个数。
实数是带有小数部分的数字,但也可以用来存储比BIGINT大的整数。实数包括FLOAT, DOUBLE, DECIMAL。
FLOAT, DOUBLE
支持使用标准浮点数进行近似计算,DECIMAL
用于存储精确小数,在新版本的 MySQL 中,DECIMAL 也支持精确计算。
MySQL 中实数可以指定精度,如 DECIMAL(20,10),指定一共20位,小数点前后各10位;对于浮点数FLOAT和DOUBLE,有多种方法可以指定所需要的精度,但可能让 MySQL 选择不同的数据类型或在存储时进行取舍,同时,这些精度定义是非标准的,所以,尽量只定义数据类型,不指定精度。
使用 DECIMAL 时,会带来额外的空间开销,计算 DECIMAL 时,由 MySQL 自己实现的高精度计算不如 CPU 支持的浮点数计算快,也会带来计算开销,所以,尽量只在对小数进行精确计算时才使用 DECIMAL。 另外,也可以考虑使用整数类型来代替,如在存储金钱时,数据库中以分为单位进行存储、计算,显示的时候再换算成元,既节省空间开销,也加快计算速度。
CHAR 和 VARCHAR 是用得最广的两种字符串数据类型。
CHAR
用来存储定长字符串,MySQL 根据定义的字符串长度来分配空间,CHAR 适用于以下几种情况:
VARCHAR
用来存储可变长字符串,因为值占用必要的存储空间,所以,一般情况下比定长字符串节省空间,但是,VARCHAR 需要一个或两个额外字节用来存储字符串长度,当长度小于256时是1个字节,否则是2个字节,所以,在特殊情况下,VARCHAR 也会比 CHAR 占用更多存储空间,如存储性别时,”M” 和 “F” 分别表示男女。
由于VARCHAR 是变长的,那么在更新时,可能需要做一些额外的工作,比如分裂页等。
在下面的情况下,适合使用VARCHAR: