首批通过分布式安全可靠测评,为关键业务系统打造
RAW 数据类型
更新时间:2026-01-27 18:32:07
RAW 是一种可变长度的数据类型,可以在具有不同字符集的数据库之间,或者具有不同字符集的服务器和客户端之间传输二进制数据流,而不需要字符集转换。本文主要介绍 RAW 数据类型的语法、参数和使用说明。
RAW 数据类型可以用于存储二进制数据或者字节串,例如图像、音频等。
RAW 数据类型的 SQL 语法如下:
RAW(length)
其中,参数 length 表示长度,以字节为单位。如果作为数据库中表的列,该参数最大支持存储 2000 字节的数据;如果作为 PL 变量,该参数最大支持存储 32767 字节的数据。
使用说明
隐式转换规则
当数据库需要将 RAW 类型的数据隐式转换为字符类型(CHAR、VARCHAR2 等)数据时,转换后的每个字符对应 RAW 类型数据的四个连续位表示的十六进制数(0~9 和 A~F 或 a~f)。例如,存储 RAW 类型数据的二进制位为 11001011(8 位,即一个字节),转换后为字符类型数据 'CB' (两个字节)。
当数据库将字符类型数据隐式转换为 RAW 类型时,会把字符串中每个字符代表的十六进制数转换成四个位,例如,字符串 'AB' 将被转换为 0XAB (10101011)。
注意
如果任一输入字符不是十六进制数(0~9 和 A~F 或 a~f),则将报错。如果字符数为奇数,则会在 RAW 类型数据开头补 0 至 RAW 类型的长度占满整字节。例如,将字符串 'ABC' 转换为 RAW 类型时,会将其转换为 0x0ABC,其中 0x0A 占一个字节,0xBC 占一个字节。
显式转换方式
SQL 函数 RAWTOHEX() 和 HEXTORAW() 执行与上述隐式转换等效的显式转换。使用 PL 系统包 UTL_RAW 和 UTL_I18N 中的函数,可以在 RAW 和字符数据之间进行其他类型的转换。
SQL 函数 HEXTORAW() 会把字符串中数据转换为十六进制数。SQL 函数 UTL_RAW.CAST_TO_RAW([VARCHAR2]) 会把字符串中每个字符的 ASCII 码存放到 RAW 类型的字段中。例如,将 051 转换为 303531。
通过隐式调用 SQL 函数 RAWTOHEX() 可以把十六进制串表示的 RAW 类型转换为字符串类型(VARCHAR),也就是十六进制数据的字符串表示形式。
RAW 数据类型相关函数如下表所示。
| 函数 | 说明 |
|---|---|
| HEXTORAW() | 当使用 hextoraw 时,会把字符串中数据转换成十六进制串,字符串中的每两个字符表示结果 RAW 中的一个字节。 |
| RAWTOHEX(rawvalue) | 将 RAW 类数值 rawvalue 转换为一个相应的十六进制表示的字符串。 rawvalue 中的每个字节都被转换为一个双字节的字符串。 |
| UTL_RAW.CAST_TO_RAW([VARCHAR2]) | 保持数据的存储内容不变,仅改变数据类型,将 VARCHAR2 转换为 RAW 类型。 |
| UTL_RAW.CAST_TO_VARCHAR2([RAW]) | 保持数据的存储内容不变,仅改变数据类型,将 RAW 类型转换为 VARCHAR2 类型。 |
| UTL_RAW.BIT_OR() UTL_RAW.BIT_AND() UTL_RAW.BIT_XOR() | 位操作。 |
示例
在
test_raw表中声明RAW型数据,并向表中分别插入一条数据。obclient> CREATE TABLE test_raw (col1 RAW(10)); Query OK, 0 rows affected obclient> INSERT INTO test_raw VALUES (UTL_RAW.CAST_TO_RAW('1234567890')); Query OK, 1 row affected obclient> SELECT UTL_RAW.CAST_TO_VARCHAR2(col1) FROM test_raw; +--------------------------------+ | UTL_RAW.CAST_TO_VARCHAR2(COL1) | +--------------------------------+ | 1234567890 | +--------------------------------+ 1 row in set向
raw_test01表中插入 2 条数据并使用函数转换。obclient> CREATE TABLE raw_test01 (id NUMBER, raw_date RAW(10)); Query OK, 0 rows affected obclient> INSERT INTO raw_test01 VALUES (1, HEXTORAW('ff')); Query OK, 1 row affected obclient> INSERT INTO raw_test01 VALUES (2, UTL_RAW.CAST_TO_RAW('051')); Query OK, 1 row affected obclient> SELECT * FROM raw_test01; +------+----------+ | ID | RAW_DATE | +------+----------+ | 1 | FF | | 2 | 303531 | +------+----------+ 2 rows in set