我尝试制作支付系统。客户可以使用比特币或其他库存来购买(美元,欧元)我有一个十进制数量列(16,8),因为比特币金额正常工作,但当我尝试将usd值设置为例如100 usd时,它变为100.00000000,我的问题应该存储这样的金额?比特币和其他货币使用相同的十进制列?计算所有记录时,它对性能有害吗?或者我应该有多列比特币十进制(16,8)和其他货币十进制(10,2),请给我一个方法,请回答时考虑数百万条记录。谢谢你有愉快的一天
答案 0 :(得分:4)
性能有两个方面 - 速度和空间。速度通常不是一个问题,因为获取行比操作十进制/双/等的成本要昂贵得多。如果你谈论十亿行,空间可能是一个问题(并导致减速)。
经验法则:DECIMAL(m,n)
占用m/2
个字节。在(16,8)
的情况下,它只需要8个字节。
DOUBLE
占用8个字节; BIGINT
:8个字节。等
请勿将VARCHAR
用于数值,尤其是在需要对其进行排序时。
FLOAT
和DOUBLE
会产生额外的舍入(十进制到/来自二进制),导致可能的舍入错误,尤其是在添加大量数字时。
我不确定,8位小数是比特币所需的官方最大值,对任何其他货币来说都足够了。对于目前使用的货币,我听说过4。 (磅/先令/便士已不再使用。)
DECIMAL(16,8)
溢出100,000,000美元/欧元/无论如何。确保这就足够了。 DECIMAL(17,8)
也需要8个字节,最多可以获得10亿个字节。所以你也可以使用17而不是16。
回到问题......没有'完美'的答案。