mySQL列没有针对DECIMAL的一刀切的精度

时间:2017-07-27 04:45:21

标签: mysql database-design precision

当我定义一个存储十进制值的表时,我使用如下语句:

CREATE TABLE myTable (
    myKey INT NOT NULL,
    myValue DECIMAL(10,2) NOT NULL,
    PRIMARY KEY (myKey)
);

然而,这导致每个myValue以一个适合所有的精度(10,2)存储。例如

45.6 becomes 45.60
21 becomes 21.00
17.008 becomes 17.01

但是如果每条记录都有不同精度的myValue呢?我需要45.6保持45.6,21保持21,17.008保持17.008。否则,测量精度会丢失。 21和21.00之间存在很大差异。

2 个答案:

答案 0 :(得分:1)

如果您不需要进行更高/更低的比较,请存储为VARCHAR(..)

字符串'21'和'21 .00'具有相同的值,但呈现不同的“精度”。

需要数值时,添加零(col + 0)。

这不允许“负精度”,例如“1.2M”表示为1200000。如果你需要,那么Norbert的方法可能会更好。

答案 1 :(得分:0)

您可以按照不同的方式存储数据,以高精度和准确的召回方式存储:

创建一个包含两列的表:

CREATE TABLE precise (value BIGINT, decimaldot INT);

使用代码确定点的位置,例如在21值:2(假设为1索引)。所以存储的值将是:

INSERT INTO precise values (21,2);

检索它将返回21精确(解析位置2的值21中的点,为21)

价值17.008也将在2:

处得出结果
INSERT INTO precise values (17008,2);

等。

使用VARCHAR(4000)代替biginteger或使用blob字段可以存储更大的值。