当前位置: 首页 > 知识库问答 >
问题:

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

丌官丰羽
2024-08-29

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

共有2个答案

西门鹏程
2024-08-29

没有。

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

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

鲁昕
2024-08-29

在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的这种差异。

 类似资料:
  • 我有一个包含函数的自定义数据类型。在下一步中,我想使用中的。 注意:这是一个练习,所以我必须使用自定义列表 调用应该是这样的:returns 我得到的错误: 没有实例(Num(整数- 问题:我看不出我的错误。为什么我没有对函数应用足够的参数?我传递一个函数的Flist,该函数获取一个Int并返回一个Int。另外,传递另一个Int,应该就是它。这里还缺什么?

  • 我需要将GPS坐标保存在一个没有安装spatial extension的Oracle数据库中。有一个软件pl/sql模拟Oracle Spatial的主要功能(显然没有使用它的数据类型),以同样的方式对Oracle 11的JSON功能进行“包装”。github:https://github.com/pljson/pljson上有这个项目

  • 目前,我们有一个数据库运行在Oracle 10g(10.2.0.2)上,需要全天候运行,但由于数据中心不支持它,服务器OS和Oracle数据库10g,我们不得不按照上级的协议转移到Oracle 12c。我知道我不能使用从10.2.0.2到12.2.0.1的直接expdp/impdp。并且资源有限,这意味着服务器资源有限,无法访问oracle支持以下载oracle 10.2.0.5修补程序集或任何可

  • 本文向大家介绍oracle清空所有表数据,包括了oracle清空所有表数据的使用技巧和注意事项,需要的朋友参考一下 方法: 1. 删除所有外键约束 2. drop表 3. 添加外键约束 代码使用powerdesign生成

  • 问题内容: 我的输入就是这样。 O / p:应该像 我想要一个可以在数据库级别上触发的查询。我尝试了各种方法,但无法做到这一点… 问题答案: 11g及更高版本: 使用listagg: 10g及以下: 一种方法是使用功能: 要使用该功能: 注意:在某些较早版本的Oracle上有一个(不受支持的)功能,该功能可能会对您有所帮助-有关详细信息,请参见此处。 在MySQL中:

  • 因此,我打算让数据库将布尔值表示为“y”或“n”,而不是true或false--并尝试将这些值映射到我在网格中手工创建的复选框。 到目前为止,我已经能够在网格中呈现复选框,并通过手工呈现它们来正确地显示为选中或不选中... 但是,当用户单击save时,我在试图将值保存回数据库时遇到了困难。 提前谢谢你,蒂姆

  • 问题内容: 有没有一种类型或方式以二进制级别在oracle中存储数据。我对表中的dml和pl / sql的操作都感兴趣。 当前所有二进制元素都以varchar2(1000)=‘11111 …0000.1111’的形式存储,但是操作和数据存储量很大,因此需要一些优化解决方案。如果此数据可以二进制格式存储,则将需要1000/8字节(具有>700mn条记录) 可能的解决方案是对这些操作使用某种Java

  • 本文向大家介绍有没有类似于MySQL中Oracle的trunc(sysdate)的功能?,包括了有没有类似于MySQL中Oracle的trunc(sysdate)的功能?的使用技巧和注意事项,需要的朋友参考一下 是的,您可以用于仅获取MySQL中的日期部分,并且可以用于获取MySQL中的当前日期。 当前日期如下- 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表