实数类型
实数是带有小数部分的数字然而 它们不只是为了存储小数部分也可以使用DECIMAL 存储比BIGINT 还大的整数MySQL 既支持精确类型也支持不精确类型
FLOAT 和DOUBLE 类型支持使用标准的浮点运算进行近似计算如果需要知道浮点运算是怎么计算的则需要研究所使用的平台的浮点数的具体实现
DECIMAL 类型用于存储精确的小数在MySQL 和更高版本DECIMAL 类型支持精确计算MySQL 以及更早版本则使用浮点运算来实现DECIAML 的计算这样做会因为精度损失导致一些奇怪的结果在这些版本的MySQL 中DECIMAL 只是一个存储类型因为CPU 不支持对DECIMAL 的直接计算所以在MySQL 以及更高版本中MySQL服务器自身实现了DECIMAL 的高精度计算相对而言CPU 直接支持原生浮点计算所以浮点运算明显更快
浮点和DECIMAL 类型都可以指定精度对于DECIMAL 列可以指定小数点前后所允许的最大位数这会影响列的空间消耗MySQL 和更高版本将数字打包保存到一个二进制字符串中(每 个字节存 个数字)例如DECIMAL() 小数点两边将各存储 个数字一共使用 个字节小数点前的数字用 个字节小数点后的数字用 个字节小数点本身占 个字节
MySQL 和更高版本中的DECIMAL 类型允许最多 个数字而早期的MySQL 版本中这个限制是 个数字并且保存为未压缩的字符串(每个数字一个字节)然而这些(早期)版本实际上并不能在计算中使用这么大的数字因为DECIMAL 只是一种存储格式在计算中DECIMAL 会转换为DOUBLE 类型
有多种方法可以指定浮点列所需要的精度这会使得MySQL 悄悄选择不同的数据类型或者在存储时对值进行取捨这些精度定义是非标准的所以我们建议只指定数据类型不指定精度
浮点类型在存储同样范围的值时通常比DECIMAL 使用更少的空间FLOAT 使用 个字节存储DOUBLE 占用 个字节相比FLOAT 有更高的精度和更大的范围和整数类型一样能选择的只是存储类型MySQL 使用DOUBLE 作为内部浮点计算的类型
因为需要额外的空间和计算开销所以应该尽量只在对小数进行精确计算时才使用DECIMAL例如存储财务数据但在数据量比较大的时候可以考虑使用BIGINT 代替DECIMAL将需要存储的货币单位根据小数的位数乘以相应的倍数即可假设要存储财务数据精确到万分之一分则可以把所有金额乘以一百万然后将结果存储在BIGINT 里这样可以同时避免浮点存储计算不精确和DECIMAL 精确计算代价高的问题
返回目录高性能MySQL
编辑推荐
ASPNET MVC 框架揭秘
Oracle索引技术
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程