我试着建立支付系统。客户可以使用比特币或其他货币(美元、欧元)进行购买我有一个十进制金额栏(16,8),对于比特币金额,它正常工作,但当我尝试将美元值设置为100美元时,它变为100.00000000,我的问题是应该这样存储金额吗?对比特币和其他货币使用相同的十进制列?在计算所有记录时对性能有害吗?或者,如果我有多栏的比特币十进制(16,8)和其他货币十进制(10,2),请告诉我一个方法,请考虑数以百万计的记录时,你回答。谢谢你今天过得愉快
最佳答案:
性能有两个方面——速度和空间。速度通常不是一个问题,因为获取行的成本远远高于操作decimal/double/etc的成本。如果您谈论的是十亿行,则空间可能是一个问题(并导致速度减慢)。
经验法则:DECIMAL(m,n)
大约占用m/2
字节。在(16,8)
的情况下,它只需要8个字节。DOUBLE
占用8个字节;BIGINT
占用8个字节。等。
不要对数值使用VARCHAR
,特别是在需要对它们进行排序时。FLOAT
和DOUBLE
产生额外的舍入(十进制到/从二进制),导致可能的舍入错误,特别是在累加大量数字时。
我不确定,8个小数位是比特币所需的官方最大值,对任何其他货币来说都绰绰有余。4是我听说过的最常用的货币。(英镑/先令/便士不再使用。)DECIMAL(16,8)
超过100000000美元/欧元/其他。确保这足够了。DECIMAL(17,8)
也需要8个字节,最多10亿个字节,所以最好使用17个字节,而不是16个字节。
回到问题上来…没有“完美”的答案。