整数型
整数类型有可选的 unsigned 属性,表示不允许负值,这可以使正数的上限提高一倍(还多 1)。有符号 和无符号类型使用相同的存储空间,并且具有相同的性能,因此可以根据实际情况选择合适的类型。 mysql 可以为整数类型指定宽度,例如 INT(11),对大多数应用来说这是没有意义的:它不会限制合法范 围,只是规定了 mysql 的一些交互工具(例如 mysql 命令行客户端)用来显示字符的个数。对于存储和计 算来说,INT(1)和 INT(20)是相同的。
实数类型
注意 FLOAT 和 DOUBLE 可表示的范围不是完全连续的浮点数,由于精度的限制,有些极小的小数是表示 不了的。
DECIMAL 类型最多允许 65 个数字,表示为 DECIMAL(M,D)的格式。例如 DECIMAL(5,2)表示最多保存 5 个 数字,其中 2 个是小数,表示的范围在-999.99 到 999.99 之间。如果小数位数 D 为 0,则 DECIMAL 值不包 含小数点或小数部分。
FLOAT 和 DOUBLE 类型只能使用标准的浮点运算进行近似运算,如果需要精确运算,例如金额计算,则 需要使用 DECIMAL 类型。
因为 cpu 不支持对 DECIMAL 的直接计算,所以在 mysql5.0 以上的版本中,mysql 服务器自身实现了
DECIMAL 的高精度计算。相对而言,cpu 直接支持原生的浮点计算,所以浮点计算明显更快。
涉及到金额计算,在数据量比较大的时候,可以考虑用 BIGINT 代替 DECIMAL。例如金额单位精确到分, 99.99 可以用 9999 表示,以分为单位存储在 BIGINT 字段里,这样可以同时避免浮点数计算的不精确和 DECIMAL 精确计算代价高的问题。
日期和时间类型
DATETIME 使用 8 个字节的存储空间,和时区无关。
TIMESTAMP 使用 4 个字节的存储空间,显示的时间依赖时区,保存了从 1970 年 1 月 1 号午夜(格林尼治标 准时间)以来的秒数,它和 unix 的时间戳相同。TIMESTAMP 只能表示从 1970 年到 2038 年。
如果插入和更新数据时没有指定 TIMESTAMP 的值,mysql 会默认的更新 TIMESTAMP 的值当前系统时间。