我想在MySQL数据库中存储许多记录。它们都包含货币价值。但我不知道每个数字要插入多少位。 为此,我必须使用哪种数据类型? VARCHAR或INT(或其他数值数据类型)?
当前回答
我们用double。
*喘息*
Why?
因为它可以表示任何15位的数字而不受小数点位置的限制。所有这些都只有可怜的8个字节!
所以它可以表示:
0.123456789012345 123456789012345.0
...以及介于两者之间的任何东西。
这很有用,因为我们处理的是全球货币,double可以存储我们可能遇到的小数点后的各种数字。
一个双字段可以代表日元的999,999,999,999,999,美元的99999,999,999.99,甚至比特币的99999,999.99999999
如果您尝试对decimal进行同样的操作,则需要decimal(30,15),它占用14个字节。
警告
当然,使用double也不是没有注意事项。
然而,这并不像一些人倾向于指出的那样失去准确性。尽管double本身在内部可能不精确到以10为基数的系统,但我们可以通过将从数据库中提取的值四舍五入到有效的小数点后数位来使其精确。如果需要的话。(例如,如果它将被输出,并且需要以10为基数的表示。)
需要注意的是,任何时候我们使用它进行算术运算时,我们都需要在以下情况下对结果进行归一化(通过四舍五入到有效的小数点位):
对其执行比较。 将其写入数据库。
另一种警告是,与decimal(m, d)不同的是,数据库将阻止程序插入多于m位的数字,而double则不存在这样的验证。一个程序可以插入一个用户输入的20位数字,它最终会被无声地记录为一个不准确的数量。
其他回答
我更喜欢使用BIGINT,并通过与100相乘来存储值,这样它将成为整数。
例如,要表示93.49的货币值,该值应存储为9349,而显示的值可以除以100并显示。这将占用更少的存储空间。
警告: 大多数情况下,我们不执行货币*货币乘法,以防万一,如果我们正在执行,然后将结果除以100并存储,以便返回适当的精度。
如果您的应用程序需要处理高达万亿的货币值,那么这应该工作:13,2 如果你需要遵守GAAP(公认会计原则),那么使用:13,4
通常你应该把你的货币值加到13,4,然后把输出四舍五入到13,2。
如果要求符合GAAP,或者需要小数点后4位:
小数(13、4) 支持最大值为:
The $999999999999
否则,如果小数点后2位足够: 小数(13日2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
实际上,这取决于程序员的偏好。我个人使用:数字(15,4)来符合公认会计原则(GAAP)。
有2个有效选项:
使用整数数量的货币小单位(例如分) 将金额表示为货币的十进制值
在这两种情况下,您都应该使用十进制数据类型来拥有足够的有效数字。区别在于精度:
即使是整数数量的小单位,也最好有额外的累加精度(考虑从1美分操作累积10%的费用) 不同的货币有不同数量的小数,加密货币有多达18个小数 由于通货膨胀,小数的数量可以随着时间的推移而改变
来源和更多的警告和事实。
推荐文章
- MySql: Tinyint (2) vs Tinyint(1) -有什么不同?
- 如何在MySQL表中移动列?
- 在MySQL中选择最后一行
- 如何删除MySQL root密码
- MySQL对重复键更新在一个查询中插入多行
- mysql_connect():[2002]没有这样的文件或目录(试图通过unix:///tmp/mysql.sock连接)在
- MySQL:如何复制行,但改变几个字段?
- 不能删除或更新父行:外键约束失败
- Mysql错误1452:不能添加或更新子行:外键约束失败
- MySQL DISTINCT在GROUP_CONCAT()上
- 第一次设计数据库:我是否过度设计了?
- MySQL选择一个列DISTINCT,与其他列相对应
- 错误1022 -不能写;表中重复的键
- 如何修改列和更改默认值?
- 如何在MySQL 8.0中授予root用户所有权限