MySQL 数据类型

January 9, 2015
作者:星爷
出处:http://lxWei.github.io/posts/MySQL-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.html
声明:转载请注明作者及出处。

上一篇主要讲了 MySQL 的简介,这篇主要总结 MySQL 中的数据类型。由于 MySQL 很多特性都是由存储引擎决定的,而自己使用得基本都是 InnoDB,所以,下面都已 InnoDB 为准。

整数类型

MySQL 中整数类型包括五种,分别是 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT,分别占用8、16、24、32、64位存储空间,同时,所有整数类型都可以是 UNSIGNEDSIGNED型,表示是否可以有负数。

在创建数据库的时候,经常指定整数类型的长度,如定义 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 和 VARCHAR 是用得最广的两种字符串数据类型。

CHAR

用来存储定长字符串,MySQL 根据定义的字符串长度来分配空间,CHAR 适用于以下几种情况:

  1. 存储很短的字符串
  2. 所有值长度都较为接近,如存储MD5值。
  3. 存储经常更新变动的值,不会产生碎片。

VARCHAR

用来存储可变长字符串,因为值占用必要的存储空间,所以,一般情况下比定长字符串节省空间,但是,VARCHAR 需要一个或两个额外字节用来存储字符串长度,当长度小于256时是1个字节,否则是2个字节,所以,在特殊情况下,VARCHAR 也会比 CHAR 占用更多存储空间,如存储性别时,”M” 和 “F” 分别表示男女。

由于VARCHAR 是变长的,那么在更新时,可能需要做一些额外的工作,比如分裂页等。

在下面的情况下,适合使用VARCHAR:

  1. 字符串最大长度比平均长度大得多。
  2. 列更新少。
  3. 使用了类似 UTF-8 编码,每个字符使用不同字节数进行存储。

BLOB 与 TEXT 类型

日期与时间类型

位数据类型

使用原则