读书笔记:Oracle 数据类型:给你的数据找个合适的“家”

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

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

Oracle 数据类型:给你的数据找个合适的“家”

想象一下,你要存放物品,会选择不同大小的盒子或柜子。数据库存储数据也是一样,为数据选择正确的“容器”——也就是数据类型——是至关重要的一步。选对了,存取高效,管理方便;选错了,可能会带来性能问题,而且后期修改非常麻烦。

Oracle 提供了丰富的数据类型来存放各种形式的数据,就像一个功能齐全的储物间。我们来简单了解一下这些主要的“容器”:

一、存放文本的容器(字符类型)

  • CHAR (定长字符串)

    • 像一个固定宽度的储物格。如果你指定了长度10(CHAR(10)),即使你只放3个字符的东西,它也会占满10个字符的空间(用空格填充)。
    • 适合:存储长度固定不变的代码,比如性别代码('M','F')、状态码等。
  • VARCHAR2 (变长字符串)

    • 像一个弹性伸缩的储物袋。你指定最大长度10(VARCHAR2(10)),你放3个字符的东西,它就只占3个字符的空间,非常节省地方。
    • 适合:存储长度不固定的文本,如姓名、地址、描述等。这是最常用的文本类型。
    • 注意:从Oracle 12c开始,它可以配置存更长的文本(最高32767字节)。
  • NCHAR / NVARCHAR2

    • 和CHAR/VARCHAR2类似,但它们是“国际版”容器,专门用于存储Unicode字符(如中文、日文、阿拉伯文等),能确保不同语言环境下的正确显示。
    • 如果你需要存储多国语言,应该优先考虑它们。

二、存放数字的容器(数字类型)

  • NUMBER (精确数字)

    • 像一个超级精确的天平或算盘,可以非常精确地存储数字(最高38位精度)。比如用来存金额、数量等要求计算绝对准确的数字。
    • 适合:几乎所有需要精确计算的数字场景。
  • BINARY_FLOAT / BINARY_DOUBLE (浮点数)

    • 像一把游标卡尺,计算速度非常快,但可能存在极细微的精度误差。
    • 适合:科学计算、大数据分析等对计算速度要求高且可以接受极小误差的场景。

三、存放日期和时间的容器(日期时间类型)

  • DATE

    • 一个基础款日历和时钟,包含年、月、日、时、分、秒
  • TIMESTAMP (时间戳)

    • 一个高精度秒表,在DATE的基础上,还可以存储小数秒(如 2023-10-27 10:30:45.123456)。
  • TIMESTAMP WITH TIME ZONE

    • 一个带时区标记的高精度秒表。它会完整记录时间和对应的时区(如 2023-10-27 10:30:45.123 -08:00)。
  • TIMESTAMP WITH LOCAL TIME ZONE

    • 一个“智能”时区秒表。你存入一个带时区的时间,它会自动转换成数据库服务器所在时区的时间来存储。当你查询时,它又会根据你电脑的当前时区显示正确的时间。

四、存放大量内容的容器(大对象类型)

  • CLOB / NCLOB

    • 用来存放超大文本,比如一篇文章、一本电子书、一份很长的日志文件。CLOB存放普通字符,NCLOB存放Unicode字符。
  • BLOB

    • 用来存放二进制数据,比如一张图片、一个PDF文件、一段压缩包、一段视频或音频文件。数据库不会尝试解析它的内容。
  • BFILE

    • 它不在数据库里存放实际数据,而是像一个“快捷方式”,只记录文件在服务器磁盘上的路径。数据库通过它去读取外面的文件。

五、其他有用的容器

  • RAW

    • 存放原始的、不需要数据库解读的二进制字节数据。比如加密后的数据、指纹信息等。
  • ROWID

    • 这不是用户的数据,而是数据库内部的“快递单号”。它唯一标识一条数据在磁盘上的精确位置,查找速度极快。

重要建议和提醒

  1. 弃用旧容器LONGLONG RAW 是Oracle很早以前的类型,现在有更好的替代品(CLOB, BLOB)。不要在新项目中使用它们,老系统也应尽快替换。
  2. 别被名字迷惑:你会看到 INT, INTEGER, FLOAT 等名字,这些在Oracle里其实是 NUMBER 类型的“别名”(同义词),是为了兼容其他数据库而设计的。
  3. 选择的关键
    • 文本:长度固定用 CHAR,长度变化用 VARCHAR2,要存多国语言用 NVARCHAR2
    • 数字:需要精确计算用 NUMBER,追求计算速度且可接受微小误差用 BINARY_FLOAT/BINARY_DOUBLE
    • 日期:只需要到秒用 DATE,需要小数秒用 TIMESTAMP,需要处理时区用 TIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE
    • 大内容:存大文本用 CLOB,存图片视频等二进制文件用 BLOB

总结一下
花点时间为你的数据选择合适的类型,就像为物品选择合适的包装盒。一个好的选择能让数据库运行得更快、更稳定,也能避免未来很多不必要的麻烦。当你不确定时,查阅官方文档或向有经验的同事请教总是个好主意。

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

posted @ 2025-11-03 16:59  认真就输  阅读(8)  评论(0)    收藏  举报