读书笔记:**Oracle 中的数字类型:怎么选?怎么用?**

news/2025/10/10 14:32:33/文章来源:https://www.cnblogs.com/www-htz-pw/p/19132999

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

Oracle 中的数字类型:怎么选?怎么用?

Oracle 数据库提供了三种主要的数字类型,它们各有特点,适用于不同的场景。简单来说:

  1. NUMBER 类型

    • 特点:精度超高,最多能存 38 位有效数字。比如可以存非常小的数(像 10 的 -130 次方),也可以存非常大的数(接近 10 的 126 次方)。
    • 存储:它在磁盘上占用的空间是可变的(0 到 22 字节),存的数字有效位数越多,占的空间就稍微大一点。
    • 适用场景:这是最常用的数字类型,尤其适合需要精确计算的场景,比如金融、财务等领域的金额和数值。
  2. BINARY_FLOAT 类型

    • 特点:单精度浮点数,遵循 IEEE 标准。能存的范围很大(约 ±10^38.53),但精度较低,只有大约 6 位有效数字。
    • 存储:固定占用 5 字节存储空间。
    • 注意:可能会丢失精度,不适合存需要精确计算的数字。
  3. BINARY_DOUBLE 类型

    • 特点:双精度浮点数,同样遵循 IEEE 标准。能存的范围极大(约 ±10^308.25),精度比 BINARY_FLOAT 高,有大约 13 位有效数字。
    • 存储:固定占用 9 字节存储空间。
    • 注意:同样可能存在精度丢失问题。

一句话总结:NUMBER 精度高,BINARY_ 范围大但可能不精确。*


举个例子就明白了

我们建一张表,用三种类型存同一个数 1234567890.0987654321,看看结果:

CREATE TABLE t (num_col    NUMBER,float_col  BINARY_FLOAT,dbl_col    BINARY_DOUBLE
);INSERT INTO t VALUES (1234567890.0987654321,1234567890.0987654321,1234567890.0987654321);SELECT * FROM t;

查询结果:

NUM_COL FLOAT_COL DBL_COL
1234567890.0987654321 1234567940.0000000000 1234567890.0987654000

你看:

  • num_col (NUMBER):原封不动,完全准确地存下来了。
  • float_col (BINARY_FLOAT):精度丢失严重,后几位都变成 0 了。
  • dbl_col (BINARY_DOUBLE):好很多,但最后两位还是丢掉了。

所以,如果你在做钱相关的计算,千万别用 BINARY_FLOAT 和 BINARY_DOUBLE


深入了解 NUMBER 类型

定义 NUMBER 类型的列时,可以指定两个参数:NUMBER(p, s)

  • p 表示 精度,即数字总共的有效位数(最大 38)。
  • s 表示 小数位数,即小数点右边的位数。

这两个参数有什么用?
它们主要是数据校验和舍入规则,并不影响数据在磁盘上的物理存储方式。

  • 精度 (p) 是约束:它规定了数字最多不能超过多少位。超了就会报错。

    CREATE TABLE t (num_col NUMBER(5,0)); -- 最多存5位整数
    INSERT INTO t VALUES (12345); -- 成功
    INSERT INTO t VALUES (123456); -- 失败!报错 ORA-01438
    
  • 小数位 (s) 管舍入:它规定了一个数字要如何四舍五入。

    CREATE TABLE t (num_col NUMBER(5,2)); -- 总共5位,其中2位是小数
    INSERT INTO t VALUES (123.456); -- 成功,会自动四舍五入为 123.46
    INSERT INTO t VALUES (1234.00); -- 失败!整数部分超了(5位精度=3位整数+2位小数)
    
  • s 也可以是负数:这表示要把数字四舍五入到小数点左边的指定位数(十位、百位等)。

    CREATE TABLE t (num_col NUMBER(5,-2)); -- 精确到百位
    INSERT INTO t VALUES (123.45); -- 会被四舍五入为 100
    INSERT INTO t VALUES (1234567); -- 会被四舍五入为 1234600
    INSERT INTO t VALUES (12345678); -- 失败!四舍五入后是12345700,超过5位了
    

关于 NUMBER 类型的存储空间

关键一点:NUMBER 是变长的,不是定长的。
它占用的空间取决于你存的数字有多大(有效位数有多少)。数字的有效位数越多,占用的字节就稍微多一点(大致每2位有效数字多占1字节)。Oracle 会尽量用最节省空间的方式来存。

这对我们有什么影响?
当你设计表并估算这张表未来会占多大磁盘空间时,对于 NUMBER 列,你不能简单地按“最大可能”来算,那样会高估。也不能按“最小可能”来算,那样会低估。最好能有一些代表性的真实数据来估算平均大小。

希望这篇文章能帮你更好地理解和使用 Oracle 的数字类型!

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Symbol?

什么是Symbol?** 例子 1:对象“私有属性”隔离(防止外部乱改)** 场景:我们写一个用户模型类 User,需要标记“是否已登录”这个状态,但不想让外部直接改。 // user.js const _isLogged = Symbol(isLogged);expor…

苹果应用上架全流程指南 iOS 应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验 - 教程

苹果应用上架全流程指南 iOS 应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

2025 年门窗厂家推荐排行榜,新标门窗从型材到成品实现全链新标造铝合金门窗 / 系统门窗推荐这十家公司

在当前的门窗行业中,消费者面临着诸多选择难题。一方面,市场上门窗产品质量参差不齐,部分厂家为降低成本,使用劣质型材和玻璃,导致门窗抗压、抗风压性能不足,使用一段时间后易出现变形、漏风漏水等问题,不仅影响…

PyCharm 2025.1重磅升级:AI驱动开发+全功能免费核心,Python开发者必看

作为Python开发者的首选IDE,JetBrains推出的PyCharm 2025.1带来了颠覆性更新。此次版本采用统一架构,首次将专业版与社区版功能深度整合,不仅让核心开发工具免费开放,更以AI驱动的全流程开发体验重新定义了Python编…

create dir or file in Qpython

Create dir or file in Qpython Import qpy Import osCreate d or f in cashos.mkdir(qpy.tmp+dir1) open(qpy.tmp+/dir1/file1.py,w)create d or f on the container directory,and will create file1 on secon…

Oracle案例:SOLARIS RAC平台模拟节点crash后强制删除与增加

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle案例:…

CAD文件处理控件Aspose.CAD教程:在 Python 中将 SVG 转换为 PDF

在本文中,我们将使用 Python 以编程方式将 SVG 转换为 PDF。我们将通过 .NET 使用 Aspose.CAD for Python,这款 CAD SDK 功能强大,足以顺利完成 SVG 到 PDF 的转换,我们将通过编写代码示例来演示其功能。如果您处理…

电子打气泵方案(工作原理和组成以及功能参数)

打气泵是一种常见的气体压缩设备,它可以将空气或其他气体压缩成高压气体,用于充气、输送、压缩等工业和生活领域。打气泵的原理是利用机械或电动力量将气体压缩,使其体积减小,压力增大,从而达到充气的目的。下面将…

2025 年电源滤波器源头厂家最新推荐排行榜:精选优质国内品牌,覆盖单相 / 三相 / 直流等多类型产品直流/IEC插座式/定制化电源滤波器厂家推荐

随着工业自动化、医疗设备、新能源等领域的高速发展,电源滤波器作为保障设备稳定运行、降低电磁干扰的核心部件,市场需求日益旺盛。但当前市场上源头厂家数量繁杂,部分厂家存在技术实力不足、产品质量不稳定、售后服…

(六)重构的艺术:简化困难条件逻辑的秘诀

(六)重构的艺术:简化困难条件逻辑的秘诀pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025 年压力表厂家最新推荐排行榜重磅发布!聚焦耐腐蚀耐震性能,助力企业精准选优质产品数显/耐高温/数字/抗震/膜盒/隔膜压力表厂家推荐

在工业生产中,压力表是保障流程安全、稳定与精准的关键仪器,化工、石化、冶金、医药等行业对其需求日益多元,却也面临诸多痛点。部分产品遇强腐蚀性介质易损坏、测量不准,振动环境下指针抖动、读值不稳,且不少品牌…

故障诊断:奇怪的ORA-01000故障处理

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。来自一位兄弟…

详细介绍:【数据分享】《中国农村统计年鉴》(1985-2024年)全pdf和excel

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年全屋定制厂家最新推荐排行榜:聚焦 ENF 级环保与优质服务力,权威甄选品牌助消费者精准选择

当下全屋定制行业飞速发展,市场品牌繁杂且质量参差不齐,消费者在选择时常常陷入困境。部分品牌忽视环保标准,产品甲醛超标威胁健康;有些品牌服务体系不完善,从设计到售后问题频发;还有品牌设计能力不足,难以满足…

2025 年绿色板材源头厂家最新推荐排行榜:聚焦 FSC 与 EPA 认证,深度测评环保板材领军品牌生态/环保/装修板材厂家推荐

在 “双碳” 战略深化与消费品质升级的双重驱动下,板材行业正加速向绿色化、智能化转型,而板材作为家居与工程装饰的核心材料,其环保性与品质直接关乎人居健康与项目质量。当前市场中厂家良莠不齐,部分产品存在有害…

大三上 需求与商业模式创新 作业1的设想:如何评价

关于“如何评价”APP的项目构想与可行性探讨 尊敬的匡老师: 您好! 我是您的学生陆舟landboat。在课程的学习过程中,我深受当前互联网文化现象的启发,构思了一款名为“如何评价”的移动应用(APP)创意。现将此构想…

C/C++逆向分析实战:变量存储与安全防护全攻略

在软件开发的世界里,C/C++语言因其卓越的性能和强大的功能而备受开发者青睐。然而,随着技术的不断进步,逆向工程也逐渐成为一种常见的攻击手段。今天,我们将深入探讨C/C++中不同类型的变量在逆向分析中的表现,并分…

2025 最新超声波清洗机厂家推荐排行榜:工业 / 精密 / 实验室多场景适配厂商权威解析数控/通过式/多功能/实验室超声波清洗机厂家推荐

在工业制造精密化、医疗检测严苛化、科研实验精细化的趋势下,超声波清洗机已成为跨领域生产的核心设备,其性能直接决定产品合格率与实验准确性。但当前市场乱象显著:部分厂商技术滞后,设备无法达到半导体行业微米级…

(8)ASP.NET Core2.2 中的MVC路由一 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …