LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节
建表 *** 作:
create table raw_test (id number, raw_date raw(10))
插入raw数据 *** 作:
insert into raw_test values (1, hextoraw('ff'))
insert into raw_test values (utl_raw.cast_to_raw('051'))
删除表 *** 作:
drop table raw_test
当使用HEXTORAW时,会把字符串中数据当作16进制数。而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中.
可以使用dump函数,查询存储情况:
select id,raw_date, dump(raw_date, 16) dump_raw from raw_test
Oracle中RAW和Varchar2常用的两个转换函数
1. UTL_RAW.CAST_TO_RAW
该函数按照缺省字符集(一般为GB2312),将VARCHAR2字符串转换为RAW。
insert into cmpp_submit (dest_terminal_id,msg_content) values('13001081371',UTL_RAW.CAST_TO_RAW('您好!'))
2. UTL_RAW.CAST_TO_VARCHAR2
该函数按照缺省字符集合(一般为GB2312),将RAW转换为VARCHAR2。
select UTL_RAW.CAST_TO_VARCHAR2(msg_content) from cmpp_deliver
其实RAW和VARCHAR是类似的,只是存储在RAW里的是二进制值,在任何时候不会做自动的字符集转换,这是RAW和VARCHAR的不同,RAW只是一种外部类型,其内部存储是VARRAW
VARCHAR的Oracle内部定义是:struct { ub2 lenchar arr[n] }
VARRAW的ORACLE内部定义是: struct { ub2 lenunsigned char arr[n] }
oceanbase数据库怎么看bclob类型的字段值是一个数据库的编程问题,需要用SQL语句或者工具来实现。bclob类型的字段值是一种二进制大对象(binary large object),用于存储大量的二进制数据,如图片、视频等。bclob类型的字段值不能直接查看,需要使用一些特殊的方法或函数来转换或截取。
有以下几种常用的方法:
使用dbms_lob.substr函数:这个函数可以截取bclob类型的字段值的一部分,并转换为raw类型,然后可以使用to_char或者utl_raw.cast_to_varchar2等函数将raw类型转换为可读的字符串。例如:
-- 假设有一个表test,包含一个bclob类型的字段dataselect dbms_lob.substr(data, 1000) from test-- 截取data字段前1000个字节,并转换为raw类型
select utl_raw.cast_to_varchar2(dbms_lob.substr(data, 1000)) from test-- 将raw类型转换为可读的字符串
使用to_char函数:这个函数可以将bclob类型的字段值转换为可读的字符串,但是有一个限制,就是转换后的字符串长度不能超过4000个字符。如果超过了4000个字符,会报错。例如:
-- 假设有一个表test,包含一个bclob类型的字段dataselect to_char(data) from test-- 将data字段转换为可读的字符串
介绍下两个函数的作用:hextoraw():十六进制字符串转换为raw;
rawtohex():将raw串转换为十六进制;
先来看下hextoraw()函数,当出现比f大的字母时(以a最小z最大)就会报错:
正确结果:
sys@ORCL>select hextoraw('abcdef') from dual
HEXTOR
------
ABCDEF
错误结果:
sys@ORCL>select hextoraw('abcdeg') from dual
select hextoraw('abcdeg') from dual
*
ERROR at line 1:
ORA-01465: invalid hex number
再来看看rawtohex()函数:
sys@ORCL>select rawtohex('AA') from dual
RAWT
----
4141
结果之所以是4141是因为A的ASCII为65,65转换为十六进制就是41。
下面再看一个较有疑惑的问题:
sys@ORCL>declare
2 a varchar2(100)
3 begin
4 select rawtohex('aaaa') into a from dual
5 dbms_output.put_line(a)
6 end
7 /
61616161
PL/SQL procedure successfully completed.
sys@ORCL>declare
2 a varchar2(100)
3 begin
4 a:=rawtohex('aaaa')
5 dbms_output.put_line(a)
6 end
7 /
AAAA
PL/SQL procedure successfully completed.
为什么会出现这种情况?
原因在于:SELECT方法用的是SQL 引擎,而:=是用PL/SQL 引擎。
本例两个调用中给的参数都是CHAR类型,这时ORACLE要进行缺省的类型转换,把'aaaa'由CHAR转到RAW。
但是SQL引擎和PL/SQL引擎的这个类型转换却不一样,SQL引擎使用了utl_raw.cast_to_raw,所以最后结果是'61616161',PL/SQL使用了HEXTORAW,而手册上的说法应该是用HEXTORAW,不知道为什么。
因此在用到rawtohex()函数时,不应该给它自动类型转换的机会,因为这是最容易出错的。
如果你期待的结果是'61616161'就该这样写:rawtohex(utl_raw.cast_to_raw('aaaa'))
如果你期待的结果是'AAAA'就该这样写:rawtohex(hextoraw('aaaa'))
不管哪个引擎都不会错了。
在使用SQL*Plus将RAW类型获取为一个串时,会隐士的调用rawtohex函数,而插入串时会隐式的调用hextoraw函数,应该避免隐式转换,而在编写代码时总是使用显示转换,这是一个很好的实践做法!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)