列类型用于保存非常不同的小数位数

时间:2016-04-19 18:23:22

标签: mysql decimal

我需要存储像

这样的数字
21000
1.0002
0.00230235
12323235
0.2349523

这是感觉数据,因此保持准确值非常重要。 这有很多选择。

我的解决方案是将所有值乘以100万,并将它们存储为bigint。那会有意义吗?

1 个答案:

答案 0 :(得分:1)

这是有道理的,但我建议你只使用decimal数据类型:https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html

如果您要乘以百万,并且如果您收到的数据集的十进制数比您预期的多一个,那么您最终会将该数字乘以1000万,将所有其他数字乘以10.相反,使用decimal数据类型将在小数点右侧显示30个数字。

  

DECIMAL列的声明语法是DECIMAL(M,D)。该   MySQL 5.7中参数的值范围如下:

     

M是最大位数(精度)。它的范围是1   到65岁。

     

D是小数点右边的位数(   规模)。它的范围为0到30,且不得大于M.

  

SQL标准要求NUMERIC(M,D)的精度为   正好是M位数。对于DECIMAL(M,D),标准要求精度   至少M位数但允许更多。在MySQL中,DECIMAL(M,D)和   NUMERIC(M,D)是相同的,两者都具有精确的M精度   位数。

     

有关DECIMAL值内部格式的完整说明,请参阅   MySQL源代码分发中的文件strings / decimal.c。格式   在decimal2bin()函数中解释(带有一个例子)。

要设置数字格式,您可以按照此答案描述的格式进行格式化:Format number to 2 decimal places

示例

create table test (
  price decimal(40,20)
);

-- all the above insertions will succeed cleanly
insert into test values (1.5), (1.66), (1.777), (1.12345678901234567890);

-- notice we have 21 digits after decimal
-- MySQL will insert data with 20 decimal and add a warning regarding data truncation
insert into test values (1.123456789012345678901);

数据

select * from test

price
1.50000000000000000000
1.66000000000000000000
1.77700000000000000000
1.12345678901234567890
1.12345678901234567890

select cast(price as decimal(40,2)) from test

price
1.50
1.66
1.78
1.12
1.12