MySQL关于⾦额问题,浮点类型和⾼精度类型以及DECIMAL
出⾃:
英文文章网站<;姜承尧的MySQL实战宝典 >,本⼈学习完了在原⽂⼜做了⼀些更改和总结
浮点类型和⾼精度型
除了整型类型,数字类型常⽤的还有浮点和⾼精度类型。
MySQL 之前的版本中存在浮点类型 Float 和 Double,但这些类型因为不是⾼精度,也不是 SQL 标准的类型,所以在真实的⽣产环境中不推荐使⽤,否则在计算时,由于精度类型问题,会导致最终的计算结果出错。
更重要的是,从 MySQL 8.0.17 版本开始,当创建表⽤到类型 Float 或 Double 时,会抛出下⾯的警告:MySQL 提醒⽤户不该⽤上述浮点类型,甚⾄提醒将在之后版本中废弃浮点类型。
position是什么意思Specifying number of digits for floating point data types is deprecated and will be removed in a future relea
1000千克
⽽数字类型中的⾼精度 DECIMAL 类型可以使⽤,当声明该类型列时,可以(并且通常必须要)指定精度和标度,例如:
米老鼠的故事
salary DECIMAL(8,2)
其中,8 是精度(精度表⽰保存值的主要位数),2 是标度(标度表⽰⼩数点后⾯保存的位数)。通常在表结构设计中,类型 DECIMAL 可以⽤来表⽰⽤户的⼯资、账户的余额等精确到⼩数点后 2 位的业务。
生日祝福英文然⽽,在海量并发的互联⽹业务中使⽤,⾦额字段的设计并不推荐使⽤ DECIMAL 类型,⽽更推荐使⽤ INT 整型类型
资⾦字段设计
少先队员怎么画在⽤户余额、基⾦账户余额、数字钱包、零钱等的业务设计中,由于字段都是资⾦字段,通常程序员习惯使⽤ DECIMAL 类型作为字段的选型,因为这样可以精确到分,如:DECIMAL(8,2)。
在海量互联⽹业务的设计标准中,并不推荐⽤ DECIMAL 类型,⽽是更推荐将 DECIMAL 转化为 整型类型。也就是说,资⾦类型更推荐使⽤⽤分单位存储,⽽不是⽤元单位存储。如1元在数据库中⽤整型类型 100 存储。
创新思维方法⾦额字段的取值范围如果⽤ DECIMAL 表⽰的,如何定义长度呢?因为类型 DECIMAL 是个变长字段,若要定义⾦额字段,则定义为DECIMAL(8,2) 是远远不够的。这样只能表⽰存储最⼤值为 999999.99,百万级的资⾦存储。
⽤户的⾦额⾄少要存储百亿的字段,⽽统计局的 GDP ⾦额字段则可能达到数⼗万亿级别。⽤类型 DECIMAL 定义,不好统⼀。
另外重要的是,类型 DECIMAL 是通过⼆进制实现的⼀种编码⽅式,计算效率远不如整型来的⾼效。因此,推荐使⽤ BIG INT 来存储⾦额相关的字段。
字段存储时采⽤分存储,即便这样 BIG INT 也能存储千兆级别的⾦额。这⾥,1兆 = 1万亿。
这样的好处是,所有⾦额相关字段都是定长字段,占⽤ 8 个字节,存储⾼效。另⼀点,直接通过整型计算,效率更⾼。
注意,在数据库设计中,我们⾮常强调定长存储,因为定长存储的性能更好。
我们来看在数据库中记录的存储⽅式,⼤致如下:
若发⽣更新,记录 1 原先的空间⽆法容纳更新后记录 1 的存储空间,因此,这时数据库会将记录 1 标记为删除,寻找新的空间给记录1使⽤,如:
一心上图中*记录 1 表⽰的就是原先记录 1 占⽤的空间,⽽这个空间后续将变成碎⽚空间,⽆法继续使⽤,除⾮⼈为地进⾏表空间的碎⽚整理。那么,当使⽤ BIG INT 存储⾦额字段的时候,如何表⽰⼩数点中的数据呢?其实,这部分完全可以交由前端进⾏处理并展⽰。作为数据库本⾝,只要按分进⾏存储即可,意思是100就是100分,就是1元,10050就是10050分,就是100.5元。