8.2 第八章 选择合适的数据类型

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 功能对表进行碎片整理。
 日期类型要根据实际需要选择能够满足应用的最小存储的日期类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值