oracle中用于保存位串的数据类型是RAW,LONG RAW(推荐使用BLOB)。
RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
LONG RAW,类似于LONG,作为数据库列表最大存储2G字节的数据,作为变量最大32760字节
RAW类型的好处就是:在网络中的计算机之间传输RAW数据时,或者使用的Oracle实用程序将RAW数据从一个数据库移到另一个数据库时,甲骨文服务器不执行字符集转换存储实际列值所需要的字节数大小随每行大小而异,最多为2,000字节。可能这样的数据类型在数据库效率上会提高,而且对数据由于字符集的不同而导致的不一致的可能性在这边也排除了。
下面是官方的定义:
注意:
提供LONG RAW数据类型是为了与现有应用程序向后兼容。对于新的应用程序,请使用BLOB和BFILE数据类型来处理大量的二进制数据。
RAW和LONG RAW数据类型用于Oracle不需要解释的数据(在不同系统间移动数据时不转换)。这些数据类型用于二进制数据或字节字符串。例如,LONG RAW可用于存储图形,声音,文档或二进制数据数组。解释取决于用途。
RAW是一种类似于VARCHAR2字符数据类型的可变长度数据类型,除了Oracle Net Services(将用户会话连接到实例)以及导入和导出实用程序在传输RAW或LONG RAW数据时不执行字符转换。相反,如果两个字符集不同,则Oracle Net Services和Import / Export会自动在数据库字符集和用户会话字符集(由ALTER SESSION语句的NLS_LANGUAGE参数设置)之间转换CHAR,VARCHAR2和LONG数据。
当Oracle自动将RAW或LONG RAW数据转换为CHAR数据或从CHAR数据转换而来时,二进制数据以十六进制形式表示,其中一个十六进制字符表示RAW数据的每四位。例如,显示位11001011的RAW数据的一个字节并作为“CB”输入。
LONG RAW数据不能编入索引,但是RAW数据可以编入索引。
常用于操作的原始类型的函数:UTL_RAW.CAST_TO_RAW,HEXTORAW。
RAW保存的为16 进制数。当使用HEXTORAW时,会把字符串中数据当作16进制数。而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中。
下面是常用到了两个函数:
utl_raw.cast_to_raw([VARCHAR2]); -将VARCHAR2转换为原始类型
utl_raw.cast_to_varchar2([原料]); -将原料转换为VARCHAR2类型
这里VARCHAR2的字符集一般是GB2312 。
因为RAW保存的为16 进制数故下面的SQL会报错: 插入test_raw值(HEXTORAW( ‘HH’))
插入到test_raw值(HEXTORAW( ‘HH’))
*
ERROR位于第1行:
ORA -01465:无效的十六进制数字
raw类型数据列常用的位操作:
utl_raw.bit_or();
utl_raw.bit_and();
utl_raw.bit_xor();
问问maclean
SQL> select UTL_RAW.CAST_TO_RAW(‘问问maclean’) from dual;
UTL_RAW.CAST_TO_RAW(‘问问MACLEAN’)——————————————————————————–E997AEE997AE6D61636C65616E
SQL> select utl_raw.cast_to_varchar2(‘E997AEE997AE6D61636C65616E’) as maclean from dual;
MACLEAN——————————————————————————–问问maclean