什么是最适合货币值的SQL数据类型?我正在使用MySQL,但更喜欢无数据库依赖性的类型。
什么是最适合货币值的SQL数据类型?我正在使用MySQL,但更喜欢无数据库依赖性的类型。
类似于Decimal(19,4)
这样的内容通常在大多数情况下都能很好地工作。您可以根据需要调整比例和精度以适应需要存储的数字。即使在SQL Server中,我也不倾向于使用"money
",因为它是非标准的。
(19,4)
相比于(19,2)
有什么好处? - ryvantage唯一需要注意的是,如果您从一个数据库迁移到另一个数据库,您可能会发现DECIMAL(19,4)和DECIMAL(19,4)的含义不同。
(http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html)
数据库: 10,5 (10个整数, 5个小数) MYSQL: 15,5 (15位数字, 10个整数 (15-5), 5个小数)
确定计算所需的小数位数也很重要。
我曾经参与开发一个股票价格应用程序,需要计算一百万股的价格。报价股价必须存储到7位有效数字。
阿萨夫的回答是:
取决于你有多少钱...
听起来有点轻浮,但实际上很恰当。
就在今天,我们遇到了一个问题,由于我们的“利率”表中的一列(GrossRate)被设置为十进制(11,4),而我们的产品部门刚刚签署了一份合同,购买了波拉波拉岛上某个惊人度假村每晚几百万太平洋法郎的房间......这在10年前设计数据库架构时从未被预料到。
在会计应用中,将数值存储为整数非常常见(甚至有些人认为这是唯一的方法)。为了了解这个概念,假设交易金额为$100.23,然后乘以100、1000、10000等来获得所需的精度。因此,如果您只需要存储美分并且可以安全地四舍五入,只需乘以100即可。在我的示例中,这将使10023成为要存储的整数。您将节省数据库中的空间,并且比较两个整数比比较两个浮点数更容易。以上仅为个人意见。
这取决于数据的性质。您需要事先考虑清楚。
虽然MySQL允许使用decimal(65,30),但如果我们想留下传输选项,31为刻度和30为精度似乎是我们的限制。
大多数常见RDBMS中的最大刻度和精度:
精度 刻度 Oracle 31 31 T-SQL 38 38 MySQL 65 30 PostgreSQL 131072 16383
2015年9月,津巴布韦政府宣布以1美元兑换35万亿津巴布韦元的比率进行交换。5
我们常说:“是啊,当然……我不需要那种疯狂的数字。” 嗯,津巴布韦人也曾这么说。 不久之前。
让我们想象您需要用津巴布韦元记录100万美元的交易(也许今天不太可能,但谁知道10年后会变成什么样子?)。
- (1百万美元) * (35万亿ZWL) = ( 10^6 ) * (35 * 10^15) = 35 * 10^21
- 我们需要:
- 2个数字来存储“35”
- 21位数字来存储零
- 小数点右边的4位数字
- 这使得小数decimal(27,4),每个条目需要15个字节
- 我们可以免费在左边再加上一位数字-我们有decimal(28,4),需要15个字节
- 现在我们可以用津巴布韦元来表示1000万美元的交易,或者防止另一次高通胀袭击,希望这种情况不会再发生
虽然来晚了,但 GAAP 是一个好的经验法则。对货币字段应用 DECIMAL(13,4)
应该足够。
如果您的应用程序需要处理高达一万亿的金钱价值,那么这个应该可以:13.2 如果需要遵守 GAAP(公认的会计原则),则使用:13.4
通常,在将输出舍入为 13.2 之前,应将您的金钱价值总和设定为 13.4。
使用 MySQL,您可以使用 DECIMAL
或 NUMERIC
数据类型,因为它们存储精确的数字数据值。
使用 13,4
允许达到 $999,999,999.9999
。根据 ISO 4217 标准,只有 2 个国家使用 4 位小数(智利和乌拉圭)。
来源:
DECIMAL(19,2)
来存储货币值,但如果你只会存储低于$1,000的值,那么这只会浪费宝贵的数据库空间。DECIMAL(N,2)
就足够了,其中N
的值至少应该是你预期在该字段中存储的最大金额数字前面的位数+5
。因此,如果你不希望存储任何大于999999.99的值,DECIMAL(11,2)
就足够了(直到预期发生改变)。DECIMAL(N,4)
,其中N
的值至少应该是你预期在该字段中存储的最大金额数字前面的位数+7
。虽然可能有些晚了,但对其他人可能会有所帮助。从我的经验和研究中,我知道并接受了decimal(19, 6)。这是在使用php和mysql时处理大量货币和汇率时的情况。
简短回答:我建议根据您的需求使用带有精度的十进制。如果您想要存储货币较小单位(例如分)的整数数字,并且在编程语言中处理小数存在问题,则可以选择精度为0的十进制。
要确定所需的精度,您需要考虑以下因素:
存储最小单位的整数数字可能导致将来需要重新调整值的精度。如果使用十进制,这将更容易。
有关详细信息和注意事项,请参见文章。