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

Unable to understand precision and scale of numeric datatype in DBMS

如果我们将列指定为 decimal(5,2),这意味着我们的精度为 5,小数位数为 2。
如果我理解正确的话,精度是数字中的最大位数,小数位数是小数点右边可以出现的最大位数。
因此,根据这个逻辑,如果我尝试插入 100.999,它应该会失败,因为这个数字的标度为 3,这是不允许的。但是当我使用在线版时,例如:
https://www.tutorialspoint.com/execute_sql_online.php
https://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

谁能解释为什么会这样?

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

因此,您可能认为通过将列定义为 decimal(5, 2),您将该列定义为 numeric,其中 5 为 precision 和 2 作为 scale,但它们都被忽略了。

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

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

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

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

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