我想在MySQL数据库中存储许多记录。所有这些都包含金钱价值。但我不知道每个数字要插入多少个数字。为此,我必须使用哪种数据类型?varchar或int(或其他数字数据类型)?
- 型我用的是deimal(10,2)…您可以根据预期大小调整值
- 型相关问题是currency;的最佳数据类型。
因为钱需要精确的表示,所以不要使用与float类似的数据类型。您可以使用定点数字数据类型
- 15是精度(包括小数点在内的值的总长度)
- 2是小数点后的位数。
参见MySQL数字类型:
These types are used when it is important to preserve exact precision, for example with monetary data.
- 对于这种情况,decimal和numeric数据类型之间的区别是什么?
- 在mysql中,decimal和numeric是相同的。
- 我个人使用numeric(19,4)来处理财务记录,这样您就可以更好地处理并轻松地接受新的请求。
- 我同意雅海的观点,小数越多越好。有些货币通常使用3位小数,如巴林、约旦或科威特第纳尔,因此至少需要3位。四五个更好。
- @EdwinHoogerbets不是会计…但在英国经营小生意…我记得很久以前的某个地方读到过,货币数字应该存储到4位小数,即使是&163;、$等,这样某些计算可能会实际使用最后2位小数,用于某些模糊的会计环境。我们需要一个会计师来确认/反驳。
您可以使用DECIMAL或NUMERIC两者都是相同的
The DECIMAL and NUMERIC types store exact numeric data values. These types are used when it is important to preserve exact precision, for example with monetary data. In MySQL, NUMERIC is implemented as DECIMAL, so the following remarks about DECIMAL apply equally to NUMERIC. : MySQL
即DECIMAL(10,2)。
好读
- 可能会令人困惑,但您的屏幕截图与您的答案文本(精度、比例)不匹配。
- 我使用十进制(10,2)作为我的货币值,但是当我输入类似于867000.00的值时,它会被保存为867。我做错什么了?
- @codeInProgress看起来像是一个区域设置问题。
- @程序中的代码是因为逗号。
我更喜欢使用BIGINT,并将值存储在乘以100的形式中,这样它将成为整数。
例如,为了表示93.49的货币值,该值应存储为9349,同时显示我们可以除以100并显示的值。这将占用更少的存储空间。
Caution:
Mostly we don't perform currency * currency multiplication, in case if we are doing it then divide the result with 100 and store, so that it returns to proper precision.
- 我记得在我的计算机系统大学课程中,一位教授告诉我类似的事情。我被教导最精确的方法是用一分钱(或美分)乘以100,然后存为整数,除以100,显示给用户。我想这对数据库系统的准确性和性能有好处。
- 我认为,这是一个Scale Removing Method,消除了国家改变规模的担忧——例如,当1020(x).03(x)改为10(x).2003(x)时——用户界面应该改变;)。
- 与decimal相比有什么优势?你需要把硬币换成美元,如果你在某个时候忘记了它,你会很难过。
- 空间是唯一的优势,但是是的,我们在使用这个特性时需要更加小心。
- 如果不明显:如果你用分数分(如$0.005或$0.12345)来储存钱,那么要小心使用除垢方法,因为它们乘以100后不会减少为整数。如果您知道值的精度,那么很明显,最好的选择是使用decimal。但如果你不知道精确性(如我的例子),那么……FLOAT是否合适?
- 当使用类似于javascript的语言(使用ieee-754存储浮点数)时,该方法的一个优点就出现了。本规范不保证0.1+0.2==0.3为真。将货币存储为整数可以确保应用程序不会出现这种错误。不过,这可能不是最好的解决方案。我是在研究解决方案时到达这一页的,但我还没有完成。
- 我喜欢这种方法,但有时,您所使用的系统不需要这样的精度,所以为了提高效率,我经常使用十进制(10,2)。
这取决于你的需要。
使用DECIMAL(10,2)通常就足够了,但是如果需要更精确的值,可以设置DECIMAL(10,4)。
如果使用大值,则将10替换为19。
- 我使用十进制(10,2)作为我的货币值,但是当我输入类似于867000.00的值时,它会被保存为867。我做错什么了?
- @是否使用错误的区域设置/小数分隔符进行编码?
如果您的应用程序需要处理高达1万亿的货币值,那么这应该是有效的:13,2如果您需要遵守GAAP(公认会计原则),则使用:13,4
通常,在将输出四舍五入到13,2之前,您应该将您的货币值总和为13,4。
- 如果你要用比特币,你需要8位小数,尽管大多数钱包都是3 en.wikipedia.org/wiki/bitcoin的mbtc。
- 别以为这个答案是真的。opendata.stackexchange.com/a/10348/[email protected]有相关资料吗?
- @伊万卡罗尔,让我替大卫回答。我认为这篇文章可能是来源rietta.com/blog/2012/03/03/best data types for currencymoney‌&8203;-in
- @NAXA链接没有引用任何来源的任何支持使用13,4作为GAAP的声明。你所做的只是链接到一篇文章,该文章提出了相同的未经证实的声明。
实际上,这取决于程序员的偏好。本人使用:numeric(15,4)以符合公认会计原则(GAAP)。
- 它与"程序员的偏好"或"个人使用"没有任何关系。它由问题域(需要十进制基数)指定。这不是一个程序员可以锻炼自己个人喜好的问题。
- 别以为这个答案是真的。opendata.stackexchange.com/a/10348/13983
我们使用
double。
*喘息*
为什么?
因为它可以表示任何15位数字,而不限制小数点的位置。只需8个字节!
所以它可以代表:
- 0.123456789012345
- 123456789012345.0
…以及两者之间的任何东西。
这很有用,因为我们要处理的是全球货币,而double可以存储我们可能遇到的各种小数位数。
单个double字段可以表示9999999999999 s(日文),99999999999.999 s(美元),甚至9999999.999999999 s(比特币)。
如果您尝试使用DECIMAL,则需要decimal(30, 15),它需要14个字节。
告诫
当然,使用double并不是没有警告的。
然而,正如一些人指出的那样,它并没有失去准确性。即使double本身在内部可能不精确到以10为基数的系统,我们也可以通过将从数据库中提取的值四舍五入到它的有效小数位来精确地计算它。如果需要的话。(例如,如果要输出,则需要以10为基数表示。)
注意事项是,无论何时我们使用它执行算术运算,我们都需要在以下时间之前将结果规范化(通过将其四舍五入到有效的小数位数):
对其进行比较。
将其写回数据库。
另一种警告是,与decimal(m, d)不同,数据库将阻止程序插入超过m位的数字,double不存在这种验证。一个程序可以插入一个用户输入的20位数字的值,最终会被静默地记录为一个不准确的数字。
在被问到这个问题的时候,没人考虑比特币的价格。对于BTC,使用DECIMAL(15,2)可能不够。如果比特币升至10万美元或以上,我们至少需要DECIMAL(18,9)来支持我们应用程序中的加密货币。
DECIMAL(18,9)在mysql中占用12字节的空间(每9位4字节)。
试用使用
这通常也适用于其他数据库
乘以10000,存储为bigint,就像VisualBasic和Office中的"货币"。请参阅https://msdn.microsoft.com/en-us/library/office/gg264338.aspx