无法理解 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
,并且无法定义 precision 和 scale(除非您使用更复杂的约束)。
您可以在此处找到有关 SQLite 数据类型和关联性的所有信息:Datatypes In SQLite Version 3
【讨论】:
以上是关于无法理解 DBMS 中数值数据类型的精度和小数位数的主要内容,如果未能解决你的问题,请参考以下文章