8.3 浮点数与定点数
对于小数的表示,MySQL 分为两种方式:浮点数和定点数。浮点数包括 float(单精度)和 double(双精度),而定点数则只有 decimal 一种表示。定点数在 MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示 M 位数字(整数位+小数位),其中 D 位位于小数点后面,M 和 D 又称为精度和标度。例如,定义为 float(7,4)的一个列可以显示为-999.9999。MySQL 保存值时进行四舍五入,因此如果在 float(7,4)列内插入 999.00009,近似结果是 999.0001。值得注意的是,浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用。float 和 double 在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示,而 decimal 在不指定精度时,默认的整数位为 10,默认的小数位为 0。
- 各种数据类型的范围
解决方案1、decimal 在MySQL中,带有小数的精确运算可以使用decimal类型
CREATE TABLE t3 (i INT, d1 decimal(10,3), d2 decimal(10,3));
+------+---------+-------+ | i | a | b | +------+---------+-------+ | 6 | -51.400 | 0.000 | +------+---------+-------+
限制 decimal的精确表示为decimal(M,D),其中M最大为65,D最大为30。因此其表示的范围是远远小于double所能表示的范围 2、基于应用的解决方案 比如商品价格涉及到小数,用20.95元表示,那么可以把价格变成以分为单位,即变成2095。 结论 不要使用float、double以及其等价类型做精确计算。如果要在MySQL中做精确计算,推荐使用decimal或者将相关计算任务交给应用。
8.4 日期类型选择
MySQL 提供的常用日期类型有DATE、TIME 、DATETIME、TIMESTAMP,它们之间的区
别在第3 章中已经进行过详细论述,这里就不再赘述。下面主要总结一下选择日期类型的原 则。
- 根据实际需要选择能够满足应用的最小存储的日期类型。如果应用只需要记录“年
份”,那么用1 个字节来存储的YEAR 类型完全可以满足,而不需要用4 个字节来 存储的DATE 类型。这样不仅仅能节约存储,更能够提高表的操作效率。
- 如果要记录年月日时分秒,并且记录的年份比较久远,那么最好使用DATETIME,
而不要使用TIMESTAMP。因为TIMESTAMP 表示的日期范围比DATETIME 要短得多。
- 如果记录的日期需要让不同时区的用户使用,那么最好使用TIMESTAMP,因为日
期类型中只有它能够和实际时区相对应。
8.5 小结
本章中主要介绍了常见数据类型的选择原则,简单归纳如下。
? 对于字符类型,要根据存储引擎来进行相应的选择。 ? 对精度要求较高的应用中,建议使用定点数来存储数值,以保证结果的准确性。 ? 对含有TEXT 和BLOB 字段的表,如果经常做删除和修改记录的操作要定时执行 OPTIMIZE TABLE 功能对表进行碎片整理。 ? 日期类型要根据实际需要选择能够满足应用的最小存储的日期类型。
时间: 2024-10-10 21:20:34