oracle raw和char 类型的区别

oracle raw和char 类型的区别,第1张

RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。

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类型的字段data

select 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类型的字段data

select 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函数,应该避免隐式转换,而在编写代码时总是使用显示转换,这是一个很好的实践做法!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10032733.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存