读书笔记: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')、状态码等。
- 像一个固定宽度的储物格。如果你指定了长度10(
-
VARCHAR2 (变长字符串):
- 像一个弹性伸缩的储物袋。你指定最大长度10(
VARCHAR2(10)),你放3个字符的东西,它就只占3个字符的空间,非常节省地方。 - 适合:存储长度不固定的文本,如姓名、地址、描述等。这是最常用的文本类型。
- 注意:从Oracle 12c开始,它可以配置存更长的文本(最高32767字节)。
- 像一个弹性伸缩的储物袋。你指定最大长度10(
-
NCHAR / NVARCHAR2:
- 和CHAR/VARCHAR2类似,但它们是“国际版”容器,专门用于存储Unicode字符(如中文、日文、阿拉伯文等),能确保不同语言环境下的正确显示。
- 如果你需要存储多国语言,应该优先考虑它们。
二、存放数字的容器(数字类型)
-
NUMBER (精确数字):
- 像一个超级精确的天平或算盘,可以非常精确地存储数字(最高38位精度)。比如用来存金额、数量等要求计算绝对准确的数字。
- 适合:几乎所有需要精确计算的数字场景。
-
BINARY_FLOAT / BINARY_DOUBLE (浮点数):
- 像一把游标卡尺,计算速度非常快,但可能存在极细微的精度误差。
- 适合:科学计算、大数据分析等对计算速度要求高且可以接受极小误差的场景。
三、存放日期和时间的容器(日期时间类型)
-
DATE:
- 一个基础款日历和时钟,包含年、月、日、时、分、秒。
-
TIMESTAMP (时间戳):
- 一个高精度秒表,在DATE的基础上,还可以存储小数秒(如
2023-10-27 10:30:45.123456)。
- 一个高精度秒表,在DATE的基础上,还可以存储小数秒(如
-
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:
- 这不是用户的数据,而是数据库内部的“快递单号”。它唯一标识一条数据在磁盘上的精确位置,查找速度极快。
重要建议和提醒
- 弃用旧容器:LONG 和 LONG RAW 是Oracle很早以前的类型,现在有更好的替代品(CLOB, BLOB)。不要在新项目中使用它们,老系统也应尽快替换。
- 别被名字迷惑:你会看到 INT, INTEGER, FLOAT 等名字,这些在Oracle里其实是 NUMBER 类型的“别名”(同义词),是为了兼容其他数据库而设计的。
- 选择的关键:
- 文本:长度固定用
CHAR,长度变化用VARCHAR2,要存多国语言用NVARCHAR2。 - 数字:需要精确计算用
NUMBER,追求计算速度且可接受微小误差用BINARY_FLOAT/BINARY_DOUBLE。 - 日期:只需要到秒用
DATE,需要小数秒用TIMESTAMP,需要处理时区用TIMESTAMP WITH TIME ZONE或TIMESTAMP WITH LOCAL TIME ZONE。 - 大内容:存大文本用
CLOB,存图片视频等二进制文件用BLOB。
- 文本:长度固定用
总结一下:
花点时间为你的数据选择合适的类型,就像为物品选择合适的包装盒。一个好的选择能让数据库运行得更快、更稳定,也能避免未来很多不必要的麻烦。当你不确定时,查阅官方文档或向有经验的同事请教总是个好主意。
------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
浙公网安备 33010602011771号