oracle中RAW数据类型

近日在研究v$latch视图时,发现一个从未见过的数据类型。v$latch 中ADDR属性的数据类型为RAW(4|8)  同时也发现v$process中的ADDR属性的数据类型也为RAW(4|8)。于是查了一下oracle 的SQL Language Reference文档,文档如下描述:

The RAW and LONG RAW data types store data that is notto be explicitly converted by Oracle Database when moving data between differentsystems. These data types are intended for binary data or byte strings.For example, you can use LONG RAW to store graphics,sound, documents, or arrays of binary data, for which the interpretation isdependent on the use.

Oracle strongly recommends that you convertLONG RAW columns to binary LOB (BLOB) columns. LOB columns are subject to farfewer restrictions than LONG columns. See TO_LOB for more information.

RAW is a variable-lengthdata type like VARCHAR2, except that Oracle Net (whichconnects client software to a database or one database to another) and theOracle import and export utilities do not perform character conversion whentransmitting RAW or LONG RAW data. In contrast, Oracle Net and the Oracleimport and export utilities automatically convert CHAR, VARCHAR2, and LONG databetween different database character sets, if data is transported betweendatabases, or between the database character set and the client character set,if data is transported between a database and a client. The client characterset is determined by the type of the client interface, such as OCI or JDBC, andthe client configuration (for example, the NLS_LANG environment variable).

When Oracle implicitlyconverts RAW or LONG RAW data to CHAR data, the resulting character valuecontains a hexadecimal representation of the binary input, where each character is a hexadecimal digit (0-9, A-F)representing four consecutive bits of RAW data. For example, one byte of RAWdata with bits 11001011 becomes the value CB.

When Oracle implicitly converts CHAR datato RAW or LONG RAW, it interprets each consecutive input character as ahexadecimal representation of four consecutive bits of binary data and buildsthe resulting RAW or LONG RAW value by concatenating those bits. If any of theinput characters is not a hexadecimal digit (0-9, A-F, a-f), then an error isreported. If the number of characters is odd, then the result is undefined.

The SQL functions RAWTOHEX and HEXTORAWperform explicit conversions that are equivalent to the above implicitconversions. Other types of conversions between RAW and CHAR data are possiblewith functions in the Oracle-supplied PL/SQL packages UTL_RAW and UTL_I18N

大概意思是该数据类型用于存储二进制格式的数据,像图像,声音,文档等等,但是oracle建议使用lob替代raw,LOB列比LONG受到更少的限制

Raw的优势: 在网络传输,或者使用导入导出工具时,oracle服务器不执行字符集转换,这样在数据库的效率上会有所提高,而且不会因为字符集不同而导致数据的不一致性

以下引用网友的测试,来说明Oracle implicitly converts RAW or LONG RAW data to CHAR data,the resulting character value contains a hexadecimal representation of thebinary input以及UTL_RAW的使用

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

LONGRAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节

测试:

SQL>create table datatype_test_raw(paddr raw(8));

Tablecreated

SQL>insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw(‘This is a rawtype test!‘));

insertinto datatype_test_raw(paddr) values(utl_raw.cast_to_raw(‘This is a raw typetest!‘))

ORA-01401:inserted value too large for column

SQL>alter table datatype_test_raw modify paddr raw(20);

Tablealtered

SQL>insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw(‘This is a rawtype test!‘));

insertinto datatype_test_raw(paddr) values(utl_raw.cast_to_raw(‘This is a raw typetest!‘))

ORA-01401:inserted value too large for column

SQL>insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw(‘This is a rawtest!‘));

1row inserted

SQL>commit;

Commitcomplete

SQL>select * from datatype_test_raw;

PADDR

----------------------------------------

54686973206973206120726177207465737421

SQL>select utl_raw.cast_to_varchar2(paddr) from datatype_test_raw;

UTL_RAW.CAST_TO_VARCHAR2(PADDR

--------------------------------------------------------------------------------

Thisis a raw test!

SQL>insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw(‘中文测试‘));

1row inserted

SQL>commit;

Commitcomplete

SQL>select utl_raw.cast_to_varchar2(paddr) from datatype_test_raw;

UTL_RAW.CAST_TO_VARCHAR2(PADDR

--------------------------------------------------------------------------------

Thisis a raw test!

中文测试

SQL>select paddr, utl_raw.cast_to_varchar2(paddr) from datatype_test_raw;

PADDR                          UTL_RAW.CAST_TO_VARCHAR2(PADDR

------------------------------------------------------------------------------------------------------------------------

54686973206973206120726177207465737421This is a raw test!

D6D0CEC4B2E2CAD4中文测试

这里用到了两个函数:

utl_raw.cast_to_raw([varchar2]);--将varchar2转换为raw类型

utl_raw.cast_to_varchar2([raw]);--将raw转换为varchar2类型

这里varchar2的字符集一般是GB2312。

另外:

utl_raw包的几个其他的函数用法:

utl_raw.cast_from_number([number]);

utl_raw.cast_to_number([number]);

位操作:

utl_raw.bit_or();

utl_raw.bit_and();

utl_raw.bit_xor();

另外还有转换函数:

hextoraw();--将对应16进制数转换为raw

关于raw和utl_raw的介绍到此结束。

原文地址:https://www.cnblogs.com/tewuapple/p/8352200.html

时间: 2024-11-10 14:26:29

oracle中RAW数据类型的相关文章

oracle中anyData数据类型的使用实例

---创建waterfallcreate or replace type waterfall is object(name varchar2(30),height number); --创建rivercreate or replace type rivertest is object(name varchar2(30),length number); create or replace procedure anydataTest /* *该实例演示了一种在参数传递时可以在集合中传递多个不同数据类

oracle中的数据类型

VARCHAR2(size)   可变长度的字符串,其最大长度为size个字节;size的最大值是4000,而最小值是1;你必须指定一个VARCHAR2的size;   NVARCHAR2(size)   可变长度的字符串,依据所选的国家字符集,其最大长度为size个字符或字节;size的最大值取决于储存每个字符所需的字节数,其上限为4000;你必须指定一个NVARCHAR2的size;   NUMBER(p,s)   精度为p并且数值范围为s的数值;精度p的范围从1到38;数值范围s的范围是从

oracle中数据类型对应java类型

地址: http://otndnld.Oracle.co.jp/document/products/oracle10g/102/doc_cd/Java.102/B19275-03/datacc.htm#BHCJBJCC SQL数据类型 JDBC类型代码 标准的Java类型 Oracle扩展的Java类型   1.0标准的JDBC类型:     CHAR java.sql.Types.CHAR java.lang.String oracle.sql.CHAR VARCHAR2 java.sql.T

Oracle 中LONG RAW BLOB CLOB类型介绍

说明: RAW: 未加工类型,可存储二进制数据或字节符 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列[不建议使用] LONG RAW: 可变长二进制数据,最长2G [不建议使用] CLOB: 字符大对象Clob 用来存储单字节的字符数据:大型文本,例如XML数据. NCLOB: 用来存储多字节的字符数据 BLOB: 用于存储二进制大对象数据:例如数码照片: BFILE: 存储在文件中的二进制数据,这个文件中的数据只能被只

Oracle中数据类型

varchar2(size)    变长字符型(最大字符) nvarchar2(size)   变长unicode字符型(最大字符) char(size)        字长字符型(最大字符) number(p,s)       数值型(p为长度最大,s为小数点后的位数--) data              日期型 clob              字符型,用于在数据库中存储单字节的大数据对象,最大4G nclob             可存放大量unicode文字信息,最大4G blo

Oracle中varchar,varchar2,nvarchar,nvarchar2的区别及其它数据类型描述

--varchar,varchar2 联系: 1.varchar/varchar2用于存储可变长度的字符串 比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个字节 2.size 的最大值是 4000,而最小值是 1,其值表示字节数,比如 varchar(20)表示最大可以存放20个字节的内容 区别: 1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节: 2.VARCHAR2

Oracle 12C -- 扩展varchar2、nvarchar2、和raw数据类型的大小限制

在12C中,varchar2,nvarchar2和raw类型从之前的4K扩展到32K 升级到12C后,参数max_string_size默认值是standard,即不改变varchar2.nvarchar2.和raw数据类型的大小限制,和11g保持一致. SQL> show parameter max_string_size NAME TYPE VALUE ------------------------------------ ----------- ---------------------

关于oracle中数据类型的选择

由于是初学,犯了如下错误: 生成表的主键id时,用当前时间的毫秒值.而在oracle中定义主键id时,用的数据类型是char(32).在mybatis中通过id取数据怎么也取不出来.想了好几天,本来以为是浏览器中取id是带有空值,于是乎就用trim()函数去除空值,但还是没有查出数据,最后才发现是数据库中的数据类型定义成固定长度了,当前时间的毫秒值只有16位,而char(32)就是固定长度的32位,意思也就是说有16位是空格了,所有没法取出数据.动手将char(32)改成varchar2(32)

Oracle中PL/SQL简介、基本语法以及数据类型

Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有自身的变量申明,赋值语句,而且还有条件,循环等流程控制语句.过程控制结构与SQL数据处理能力无缝的结合形成了强大的编程语言,可以创建过程和函数以及程序包. PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性的发送给服务器,由服