我想在MySQL数据库中存储许多记录。它们都包含货币价值。但我不知道每个数字要插入多少位。 为此,我必须使用哪种数据类型? VARCHAR或INT(或其他数值数据类型)?
当前回答
这取决于你的需要。
使用DECIMAL(10,2)通常就足够了,但如果你需要更精确的值,你可以设置DECIMAL(10,4)。
如果使用大值,则将10替换为19。
其他回答
因为货币需要精确的表示,所以不要使用像float这样的近似数据类型。您可以使用定点数值数据类型
decimal(15,2)
15是精度(包括小数点在内的值的总长度) 2是小数点后的位数
参见MySQL数值类型:
当需要保持精确的精确度时,例如货币数据,就会使用这些类型。
如果您的应用程序需要处理高达万亿的货币值,那么这应该工作:13,2 如果你需要遵守GAAP(公认会计原则),那么使用:13,4
通常你应该把你的货币值加到13,4,然后把输出四舍五入到13,2。
实际上,这取决于程序员的偏好。我个人使用:数字(15,4)来符合公认会计原则(GAAP)。
在提出这个问题的时候,没有人考虑比特币的价格。在BTC的情况下,使用DECIMAL(15,2)可能是不够的。如果比特币将上涨到10万美元或更多,我们将至少需要DECIMAL(18,9)来支持我们的应用程序中的加密货币。
DECIMAL(18,9)在MySQL中占用12个字节的空间(每9个数字占用4个字节)。
我更喜欢使用BIGINT,并通过与100相乘来存储值,这样它将成为整数。
例如,要表示93.49的货币值,该值应存储为9349,而显示的值可以除以100并显示。这将占用更少的存储空间。
警告: 大多数情况下,我们不执行货币*货币乘法,以防万一,如果我们正在执行,然后将结果除以100并存储,以便返回适当的精度。
推荐文章
- 在ROR迁移期间,将列类型从Date更改为DateTime
- 如何删除所有MySQL表从命令行没有DROP数据库权限?
- 从主机连接到docker容器中的mysql
- 如果任何字段包含NULL, MySQL CONCAT将返回NULL
- MySQL中的字符串连接
- Laravel未知列'updated_at'
- MySQL更新内部连接表查询
- 根据查询结果设置用户变量
- 不能删除外键约束中需要的索引
- MySQL现在()+1天
- MySQL索引的最佳实践是什么?
- 如何在Mac OS安装时停止MySQL ?
- 外键约束:何时使用ON UPDATE和ON DELETE
- 在MySQL中使用INDEX和KEY有什么区别?
- 连接查询vs多个查询