CLOB,NCLOB,BLOB都是内部的LOB(Large Object)类型,最长4G,没有LONG只能有一列的限制注意: LONG 和 LONG RAW在Oracle新版已不推荐使用(使用BLOB替代),只是为了向后兼容而保留着。本文着重介绍:RAW/CLOB/BLOB1、RAW类型 1.1 介绍 You use the RAW datatype to store binary data or byte strings. For example, a RAW variable might store a sequence of graphics characters or a digitized picture. Raw data is like VARCHAR2 data, except that PL/SQL does not interpret raw data. Likewise, Oracle Net does no character set conversions when you transmit raw data from one system to another. The RAW datatype takes a required parameter that lets you specify a maximum size up to 32767 bytes. The syntax follows: RAW(maximum_size) You cannot use a symbolic constant or variable to specify the maximum size; you must use an integer literal in the range 1 .. 32767. You cannot insert RAW values longer than 2000 bytes into a RAW column. You can insert any RAW value into a LONG RAW database column because the maximum width of a LONG RAW column is 2147483648 bytes or two gigabytes. However, you cannot retrieve a value longer than 32767 bytes from a LONG RAW column into a RAW variable. Note that the LONG RAW datatype is supported only for backward compatibility; see “LONG and LONG RAW Datatypes” on page 3-5 for more information.RAW英语的意思为:生的;未加工的; 你可以使用RAW类型存储二进制数据或字节符。例如,一个RAW变量可以存储一系列图形字符或一张数码照片。 RAW数据就像VARCHAR2数据,除了一点:PL/SQL不会对其进行解释。同样的,当你在传输RAW数据时,Oracle Net不会对其进行字符集转换。RAW数据类型要求指定一个最大值到32767的参数;声明格式如下: RAW(maximum_size) 你不能使用一个符号常量或变量来代替该参数而必须使用1..32767中的任一整数。你不能往RAW列中插入超过2000字节的字符; 你可以往long raw列中插入任何raw数据,最大支持2G。然而,反过来则无法一次性取出超过32767字节的raw数据。此处需要注意,long raw是早起版本的类型;现在已不建议使用;详细见以下内容:1.2 相关工具 –包 utl_raw–函数 utl_raw.cast_to_raw utl_raw.cast_to_number utl_raw.cast_to_varchar2 hextorawRAW保存的为16进制数。当使用HEXTORAW时,会把字符串中数据当作16进制数。 而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中。1.3 例子drop table test_raw; create table test_raw(msg raw(2000)); SCOTT@orcl> insert into test_raw values("<xml><name>Dylan</name><score>100</score></xml>"); insert into test_raw values("<xml><name>Dylan</name><score>100</score></xml>") * 第 1 行出现错误: ORA-01465: 无效的十六进制数字--这个地方注意是十六进制 SCOTT@orcl> insert into test_raw values(utl_raw.cast_to_raw("<xml><name>Dylan</name><score>100</score></xml>"));已创建 1 行。SCOTT@orcl> commit;--查看 select msg from test_raw; MSG ------------------------------------------------------------------------------ 3C786D6C3E3C6E616D653E44796C616E3C2F6E616D653E3C73636F72653E3130303C2F73636F72 653E3C2F786D6C3E0ABCSCOTT@orcl> select utl_raw.cast_to_varchar2(msg) from test_raw;UTL_RAW.CAST_TO_VARCHAR2(MSG) ------------------------------------------------------------------------------ <xml><name>Dylan</name><score>100</score></xml>2、LONG和LONG RAW类型可以使用LONG类型存储变长字符串。Long类型就像VARCHAR2一样,除了LONG的最大容量为32760;使用LONG RAW类型存储二进制数据或字节字符串。LONG RAW数据就像LONG数据,除了LONG RAW数据不会被PL/SQL解释。 LONG RAW的最大容量也为32760.你可以往LONG列中插入任何LONG数据,最大长度为2G。然而,PL/SQL中的LONG类型变量只能支持到32760。 这条规则同样适用于LONG RAW类型。表中的LONG列可以存储文本,字符数组,甚至短文档。可以针对该类型列做UPDATE, INSERT, 和SELECT 操作。 但是无法再表达式,SQL函数调用或特定的SQL条件语句例如WHERE, GROUP BY和CONNECT BY。In SQL statements, PL/SQL binds LONG values as VARCHAR2, not as LONG. However, if the length of the bound VARCHAR2 exceeds the maximum width of a VARCHAR2 column (4000 bytes), Oracle converts the bind type to LONG automatically, then issues an error message because you cannot pass LONG values to a SQL functionSQL语句中, PL/SQL将LONG类型作为VARCHAR2类型绑定。然而,如果所绑定的VARCHAR2长度超出了4000,ORACLE会自动转换到LONG, 然后抛出一个错误因为你不能将LONG值传递给SQL函数。--例如: SCOTT@orcl> create table long_test(id number, msg long);表已创建。SCOTT@orcl> insert into long_test values(1,"hello world");已创建 1 行。SCOTT@orcl> commit;提交完成。SCOTT@orcl> select * from long_test where msg="123"; select * from long_test where msg="123" * 第 1 行出现错误: ORA-00997: 非法使用 LONG 数据类型 SCOTT@orcl> / ID MSG ---------- -------------------------------------------------------------------------------- 1 hello worldSCOTT@orcl> select id, trim(msg) from long_test where id = 1; select id, trim(msg) from long_test where id = 1 * 第 1 行出现错误: ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 LONG3、CLOB 可以使用CLOB类型大块的字符数据。每一个CLOB变量存储一个定位器,指向一个大块字符数据。CLOBs participate fully in transactions, are recoverable, and can be replicated. Changes made by package DBMS_LOB can be committed or rolled back. CLOB locators can span transactions (for reads only), but they cannot span sessions.CLOB参与整体事务,可恢复,并且可以重复。 由DBMS_LOB包改变的数据可以提交和回滚。CLOB定位器可以跨事务,但不能跨会话。4、BLOB You use the BLOB datatype to store large binary objects in the database, in-line or out-of-line. Every BLOB variable stores a locator, which points to a large binary object. BLOBs participate fully in transactions, are recoverable, and can be replicated. Changes made by package DBMS_LOB can be committed or rolled back. BLOB locators can span transactions (for reads only), but they cannot span sessions.用于存储大二进制对象,BLOB参与整体事务,可恢复,并且可以重复。 由DBMS_LOB包改变的数据可以提交和回滚。BLOB定位器可以跨事务,但不能跨会话。drop table blob_test;SCOTT@orcl> create table blob_test( id number primary key, content blob not null);表已创建。SCOTT@orcl> insert into blob_test values(1,"11111000011111");已创建 1 行。SCOTT@orcl> commit;提交完成。SCOTT@orcl> select * from blob_test;SCOTT@orcl> set linesize 2000 SCOTT@orcl> / ID CONTENT ---------- ----------------------------------- 1 11111000011111 SCOTT@orcl> insert into blob_test values(1,"11111000011111>"); insert into blob_test values(1,"11111000011111>") * 第 1 行出现错误: ORA-01465: 无效的十六进制数字 SCOTT@orcl> update blob_test set content=to_blob("110010000110011") where id=1;已更新 1 行。SCOTT@orcl> rollback 2 ;回退已完成。SCOTT@orcl> select * from blob_test; ID CONTENT ---------- --------------------------------------------------------------------- 1 11111000011111 delete from blob_test where id=1; commit;更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址