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



如果我们将列指定为十进制(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),您将该列定义为数值,其中5表示精度而2表示scale。但所有这些都被忽略了

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

你可以在这里找到关于SQLite数据类型和亲缘关系的所有信息:SQLite版本3 中的数据类型

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

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

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

最新更新