无法理解 DBMS 中数值数据类型的精度和小数位数

Posted

技术标签:

【中文标题】无法理解 DBMS 中数值数据类型的精度和小数位数【英文标题】:Unable to understand precision and scale of numeric datatype in DBMS 【发布时间】:2021-09-20 23:40:46 【问题描述】:

如果我们将列指定为小数(5,2),这意味着我们的精度为 5,小数位数为 2。 如果我理解正确,精度是数字中的最大位数,比例是小数点右侧可以出现的最大位数。 因此,从这个逻辑来看,如果我尝试插入 100.999,它应该会失败,因为这个数字的比例是 3,这是不允许的。但是当我使用在线版本时,例如:https://www.tutorialspoint.com/execute_sql_online.phphttps://www.mycompiler.io/new/sql 并运行以下查询:

CREATE TABLE nd (nv decimal(5, 2));
INSERT INTO nd VALUES(100.999);
INSERT INTO nd VALUES(1001.2);
INSERT INTO nd VALUES(10011.2);
INSERT INTO nd VALUES(100111.299999);
Select * from nd;

这给了我输出:

100.999
1001.2
10011.2
100111.2991999

谁能解释为什么会这样?

【问题讨论】:

我删除了不一致的数据库标签。仅使用您真正使用的数据库进行标记。 【参考方案1】:

精度是数字中的位数。比例是数字中小数点右侧的位数。例如,数字 123.45 的精度为 5,小数位数为 2。

那些在线的 SQL 执行器可能使用 SQLite,它忽略了小数以及相应的小数位和精度,正如@forpas 所说。

如果您尝试在 postgresql 等数据库中执行查询,您将得到您预期的错误,数字字段溢出异常。 试试这个engine 来执行你的查询,希望你能明白发生了什么。

【讨论】:

【参考方案2】:

唯一不会抱怨并运行您的代码的数据库是 SQLite,因为在 SQLite 中没有 DECIMAL 数据类型。

所以,也许您认为通过将列定义为 decimal(5, 2),您将列定义为 numeric,其中 5 为 precision,2 为 scale ,但它们都被忽略了。

对于 SQLite,您只需定义一个具有 NUMERIC 亲和力的列,仅此而已。 您应该使用的正确数据类型是 REAL,并且无法定义 precisionscale(除非您使用更复杂的约束)。

您可以在此处找到有关 SQLite 数据类型和关联性的所有信息:Datatypes In SQLite Version 3

【讨论】:

以上是关于无法理解 DBMS 中数值数据类型的精度和小数位数的主要内容,如果未能解决你的问题,请参考以下文章

单精度、双精度各有几位小数?

oracle中number类型 默认长度是多少

Oracle NUMBER 数据类型中的精度和小数位数是啥意思

Postgres 中数字数据类型的精度和小数位数是多少?

对JS基础学习的重新理解

sqlserver中的小数类型(float和decimal)