Oracle里到底有没有integer,smallint等数据类型?

版本Oracle 19,我使用DataGrip创建表,字段类型设置为smallint和integer,但是我发现最终生成的表的字段类型是number(*),而且无论我使用SQL新建表还是用对话框新建表,都是这个效果。但是如果不支持integer和smallint,为什么不报错?如果支持,那numbere(*)的取值范围和前两者完全是不一样的。到底真相是什么?

阅读 1.1k
avatarAI BotBETA

在Oracle数据库中,确实没有直接对应于SQL标准中的INTEGERSMALLINT这样的精确数值数据类型。Oracle使用NUMBER数据类型来存储数值,它可以存储非常大或非常小的数值,以及包含小数点的数值。

当你尝试在Oracle中创建一个表,并为其字段指定SMALLINTINTEGER时(如通过某些IDE或工具,如DataGrip),Oracle实际上并不直接识别这些类型。然而,很多数据库工具和IDE在内部会将这些类型映射到它们认为最接近的Oracle类型。在这种情况下,SMALLINTINTEGER通常会被映射到NUMBER类型,因为NUMBER是Oracle中最通用的数值类型。

至于为什么不会报错,这是因为Oracle的NUMBER类型非常灵活,能够存储多种精度的数值。当你指定一个字段为NUMBER而没有指定精度和标度时(如NUMBER(*)),Oracle会根据需要为数值分配存储空间,这通常意味着它可以存储非常大或非常小的数值。虽然这与你可能期望的SMALLINTINTEGER的固定大小和限制有所不同,但Oracle的NUMBER类型确实提供了一种方式来存储这些数值类型的数据。

如果你想在Oracle中模拟SMALLINTINTEGER的行为,你可以通过为NUMBER类型指定精度和标度来实现。例如,一个SMALLINT可以大致等同于NUMBER(5)(尽管SMALLINT通常被视为有符号的16位整数,范围从-32,768到32,767,但NUMBER(5)的精度较低,可能不足以精确表示所有可能的SMALLINT值,特别是当考虑到符号位时),而一个INTEGER可以大致等同于NUMBER(10)NUMBER(11)(取决于是否包括符号位)。然而,这种映射并不完美,因为NUMBER类型始终包含小数点的概念,即使标度为0。

总的来说,如果你在Oracle中需要精确控制数值的范围和大小,你应该使用NUMBER类型并明确指定精度和标度。如果你来自使用SMALLINTINTEGER的SQL环境,可能需要调整你的设计以适应Oracle的这种差异。

2 个回答

没有。

Oracle 数值只有 number 类型,别的数值类型都是为了方便你从其他数据库迁移过来而提供的别名,实质上还是 number

就像 SQLite 里字符串其实只有 text 类型,但也兼容你写的 varchar 一样。

新手上路,请多包涵

Oracle 提供了 "number" 数据类型来表示整数和小数

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏