版本Oracle 19,我使用DataGrip创建表,字段类型设置为smallint和integer,但是我发现最终生成的表的字段类型是number(*)
,而且无论我使用SQL新建表还是用对话框新建表,都是这个效果。但是如果不支持integer和smallint,为什么不报错?如果支持,那numbere(*)
的取值范围和前两者完全是不一样的。到底真相是什么?
版本Oracle 19,我使用DataGrip创建表,字段类型设置为smallint和integer,但是我发现最终生成的表的字段类型是number(*)
,而且无论我使用SQL新建表还是用对话框新建表,都是这个效果。但是如果不支持integer和smallint,为什么不报错?如果支持,那numbere(*)
的取值范围和前两者完全是不一样的。到底真相是什么?
在Oracle数据库中,确实没有直接对应于SQL标准中的INTEGER
和SMALLINT
这样的精确数值数据类型。Oracle使用NUMBER
数据类型来存储数值,它可以存储非常大或非常小的数值,以及包含小数点的数值。
当你尝试在Oracle中创建一个表,并为其字段指定SMALLINT
或INTEGER
时(如通过某些IDE或工具,如DataGrip),Oracle实际上并不直接识别这些类型。然而,很多数据库工具和IDE在内部会将这些类型映射到它们认为最接近的Oracle类型。在这种情况下,SMALLINT
和INTEGER
通常会被映射到NUMBER
类型,因为NUMBER
是Oracle中最通用的数值类型。
至于为什么不会报错,这是因为Oracle的NUMBER
类型非常灵活,能够存储多种精度的数值。当你指定一个字段为NUMBER
而没有指定精度和标度时(如NUMBER(*)
),Oracle会根据需要为数值分配存储空间,这通常意味着它可以存储非常大或非常小的数值。虽然这与你可能期望的SMALLINT
或INTEGER
的固定大小和限制有所不同,但Oracle的NUMBER
类型确实提供了一种方式来存储这些数值类型的数据。
如果你想在Oracle中模拟SMALLINT
或INTEGER
的行为,你可以通过为NUMBER
类型指定精度和标度来实现。例如,一个SMALLINT
可以大致等同于NUMBER(5)
(尽管SMALLINT
通常被视为有符号的16位整数,范围从-32,768到32,767,但NUMBER(5)
的精度较低,可能不足以精确表示所有可能的SMALLINT
值,特别是当考虑到符号位时),而一个INTEGER
可以大致等同于NUMBER(10)
或NUMBER(11)
(取决于是否包括符号位)。然而,这种映射并不完美,因为NUMBER
类型始终包含小数点的概念,即使标度为0。
总的来说,如果你在Oracle中需要精确控制数值的范围和大小,你应该使用NUMBER
类型并明确指定精度和标度。如果你来自使用SMALLINT
或INTEGER
的SQL环境,可能需要调整你的设计以适应Oracle的这种差异。
2 回答1.3k 阅读
2 回答1.1k 阅读
1 回答1.3k 阅读
1 回答919 阅读
749 阅读
712 阅读
652 阅读
没有。
Oracle 数值只有
number
类型,别的数值类型都是为了方便你从其他数据库迁移过来而提供的别名,实质上还是number
。就像 SQLite 里字符串其实只有
text
类型,但也兼容你写的varchar
一样。