MySQL :(产品)价格的首选列类型?


76

在MySQL中,用于存储产品价格(或一般货币)的首选列类型是什么?Google得知我经常使用DECIMAL FLOAT,但我想知道哪种更好。

我存储的价格范围是0.01到25.00。当然,更高的值也是可能的。(注意:我不是在要求复制粘贴代码,我只是向您提供更多信息,可以帮助您形成更完整的答案)。

谢谢

Answers:


83

小数是我要使用的那个

十进制/数字和浮点数之间的基本区别:浮点数是近似数字数据类型,这意味着并非可以准确表示数据类型范围内的所有值。小数/数字是固定精度数据类型,这意味着数据类型reane中的所有值都可以精确地表示为小数位数。

从十进制或数字转换为浮点数可能会导致精度损失。对于十进制或数字数据类型,SQL Server将精度和小数位的每种特定组合视为不同的数据类型。DECIMAL(4,2)和DECIMAL(6,4)是不同的数据类型。这意味着11.22和11.2222是不同的类型,尽管float并非如此。对于FLOAT(6),11.22和11.2222是相同的数据类型。


感谢jdt199和Razzie,将接受您的两个答案,但选择您的答案是最完整的。
SolidSmile

1
@Sheff DECIMAL(2,2)应该为DECIMAL(4,2)。DECIMAL(2,4)应该为DECIMAL(6,4)。见dev.mysql.com/doc/refman/5.7/en/...
cgaldiolo

PrestaShop使用Decimal(20,2)。所以是十进制!github.com/PrestaShop/PrestaShop/blob/1.7.3.x/install-dev/data/...
DevWL

29

字段类型“十进制”是好的。

如果您有较高的价格,则可以使用,product_price decimal(6,2) NOT NULL,即您可以存储最多6位数字的价格,小数点在2位数字之前。

字段的最大值product_price decimal(6,2) NOT NULL,将存储价格高达9999.99

如果所有价格都在0.01到25.00之间,则价格product_price decimal(4,2) NOT NULL,会很好;但是,如果价格较高,则可以在中设置任何值decimal(4,2)



9

我更喜欢INT(价格乘以100),它可以解决其他软件中的浮点问题。


5
我继承了这样的系统,很高兴看到这个人在基于价格进行数据库搜索之前如何将所有价格相乘,反之亦然。后来,在移至小数之前,我已经忍受了很多这样的错误
-Tebe

@ГляОпаОпа您如何使用十进制解决浮点问题?
彼得

在存储之前,我将每个数字四舍五入到第三个符号,然后使用DECIMAL(N,3)进行存储
Tebe

@ГляОпаОпа,如果DB会为您做,为什么还要四舍五入呢。当您比较数字0.3!== 0.30000000001时,问题开始。因此,基本上,每次要减去或加数字时都需要四舍五入数字。
彼得

由于所有付款提供商(PSP)都采用这种方式工作,因此对于2位小数点精度的价格来说,这应该不是一个糟糕的解决方案。
Meloman

-7

十进制是错误的,因为如果您想将价格设置为十进制12.99,则将其设置为13.00。这是错误的,但是如果您使用float,则可以将其另存为12.99。因此正确的答案是float和varchar。


这不是真的。
Sneftel

在几个级别上是错误的。小数[N,2]不会像您所说的那样四舍五入,它将精确地保留那2个小数位。这就是它的目的。
西蒙·蒂尔森

我知道人们投了反对票,但事实仍然如此,答案是浮动的。您还可以检查大多数付款系统是否将价格保存为浮动价格...将价格属性另存为浮动价格!
Berk Kanburlar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.