读书笔记:深入理解Oracle中的特殊数据类型:N变体类型、二进制RAW与扩展数据类型

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

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

深入理解Oracle中的特殊数据类型:N变体类型、二进制RAW与扩展数据类型

在日常的数据库开发中,我们经常会遇到各种数据类型。除了最基础的VARCHAR2和CHAR,Oracle还提供了一些特殊的数据类型来满足特定的需求。本文将带你了解三种非常有用的数据类型:N变体类型(如NVARCHAR2和NCHAR)、二进制RAW类型以及Oracle 12c引入的扩展数据类型。

一、N变体类型:轻松处理多字符集

为什么需要N变体类型?
想象一下,你的数据库主要使用单字节字符集(比如常见的WE8MSWIN1252),但突然需要存储中文、日文等多字节字符(如UTF-8)。这时,如果直接使用普通的VARCHAR2,可能会遇到乱码或存储效率低下的问题。

N变体类型(NVARCHAR2和NCHAR)就是为解决这个问题而生的。它们有两个核心特点:

  1. 数据存储在“国家字符集”中,而不是数据库的默认字符集。这意味着它们天生就能更好地支持多语言环境。
  2. 长度总是以“字符”为单位。比如NVARCHAR2(10)总能存储10个中文字符,而不用关心底层需要多少个字节。

如何查看国家字符集?
执行下面的SQL语句即可:

SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';

如果你的结果是AL32UTF8(UTF-8编码),那么NVARCHAR2就非常适合存储需要国际化的文本内容。

适用场景:你的系统大部分是英文(单字节),但需要部分支持中文、日文等(多字节)的新功能。


二、二进制RAW类型:存储“非文本”数据

什么是RAW类型?
RAW类型用于存储纯粹的二进制数据,而不是文本。它非常适合存储那些不应该被数据库进行字符集转换的数据。

哪些数据算“非文本”?

  • 加密数据:加密后的信息是一串二进制码,不是文本。
  • 文件内容:例如Word文档,其中包含大量二进制格式信息。
  • 图像、音频的二进制流等。

如何使用RAW?

CREATE TABLE t (raw_data RAW(16)); -- 创建一个能存储16字节二进制数据的表

重要特性

  • 可变长度:和VARCHAR2一样,RAW(16)的实际存储大小是0到16字节,非常节省空间。
  • 显示为16进制:在SQL*Plus等工具中,RAW数据会自动转换为16进制字符串显示,方便阅读。例如,二进制值会被显示为类似EEF18AA3...的字符串。
  • 避免隐式转换:虽然Oracle会自动在字符串和RAW之间转换,但为了代码清晰,建议使用HEXTORAWRAWTOHEX函数进行显式操作。
    INSERT INTO t VALUES (HEXTORAW('ABCDEF')); -- 明确插入16进制字符串对应的二进制数据
    SELECT RAWTOHEX(raw_data) FROM t; -- 明确将二进制数据转换为16进制字符串查看
    

注意:除了RAW,Oracle还提供了BLOB和LONG RAW来存储更大的二进制数据,但新项目应优先使用BLOB,LONG RAW是为兼容老版本而保留的。


三、扩展数据类型:突破4000字节的限制

为什么需要扩展数据类型?
在Oracle 12c之前,VARCHAR2和NVARCHAR2最多只能存储4000字节,RAW最多2000字节。这对于现代应用(如存储JSON、XML大文本)来说远远不够。从12c开始,你可以通过配置,将这些类型的长度扩展到32,767字节

如何启用?(非常重要!)
这是一个单向操作,一旦启用就无法轻易回退,必须在SYS用户下执行:

SHUTDOWN IMMEDIATE;
STARTUP UPGRADE;
ALTER SYSTEM SET max_string_size=extended;
@?/rdbms/admin/utl32k.sql -- 执行Oracle提供的脚本
SHUTDOWN IMMEDIATE;
STARTUP;

警告:务必在测试环境充分测试后再在生产环境操作,并确保有完整的备份。

使用扩展数据类型
启用后,你就可以创建超大字段的表了:

CREATE TABLE t (big_column VARCHAR2(32767)) TABLESPACE users;

内部原理:扩展数据类型在底层实际上是使用LOB(大对象)技术实现的。但这对你来说是透明的,你依然可以像操作普通VARCHAR2一样使用它,进行所有常规的SQL查询、排序、过滤等操作,甚至可以通过数据库链接(DBLINK)访问,而直接使用CLOB类型则不行。

优势

  • 兼容性好:行为与VARCHAR2完全一致,迁移其他数据库(如MySQL、PostgreSQL)中的大字段到Oracle变得非常容易。
  • 功能强大:支持比直接使用LOB更灵活的操作(如集合运算UNION/MINUS)。

适用场景:需要存储大于4000字节但不超过32KB的文本或二进制数据,且希望保持与普通字符串类型一样的操作体验。


总结

数据类型 核心用途 关键特点
NCHAR/NVARCHAR2 存储多语言字符集数据 使用国家字符集,长度以字符为单位
RAW 存储纯二进制数据 避免字符集转换,显示为16进制
扩展VARCHAR2/RAW 存储超大字符串/二进制数据 长度最高32KB,底层用LOB实现,操作透明

选择合适的数据类型是数据库设计的关键一步。希望本文能帮助你在遇到特殊需求时,做出更明智的选择。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-09-30 14:04  认真就输  阅读(12)  评论(0)    收藏  举报