关于在sql上查询blob类型数据的操作要点
2017-11-14 09:23
591 查看
blob字段直接用 select *from table_name where column like‘%%’查找的时候是不能实现的 ,主要是字段类型不符。不过我们可以用数据库自带的 utl_raw 函数进行blob 字段的插入,查询和模糊匹配。
先介绍一下Oracle中RAW和 varchar2常用的两个转换函数
1. UTL_RAW.CAST_TO_RAW
该函数按照缺省字符集(一般为GB2312),将VARCHAR2字符串转换为RAW。
SQL> select UTL_RAW.CAST_TO_RAW('xiaowurq') from dual;
SQL> select UTL_RAW.CAST_TO_RAW('xiaowurq') raw1,UTL_RAW.CAST_TO_RAW('肖舞') raw2 from dual;
RAW1 RAW2
------------------------------------------------------------
7869616F77757271 D0A4CEE8
也可以用 rawtohex 函数实现:
SQL> select rawtohex('xiaowurq') raw1,rawtohex('肖舞') raw2from dual;
RAW1 RAW2
------------------------------ ------------------------------
7869616F77757271 D0A4CEE8
2.UTL_RAW.CAST_TO_VARCHAR2
该函数按照缺省字符集合(一般为GB2312),将RAW转换为VARCHAR2。
SQL> select UTL_RAW.CAST_TO_VARCHAR2('7869616F77757271')var1, UTL_RAW.CAST_TO_VARCHAR2('D0A4CEE8') var2 fromdual;
VAR1 VAR2
------------------------------------------------------------
xiaowurq 肖舞
其实RAW和VARCHAR是类似的,只是存储在RAW里的是二进制值,在任何时候不会做自动的字符集转换,这是RAW和VARCHAR的不同,RAW只是一种外部类型,其内部存储是VARRAW。
下面整体做个实验:
(1)创建表
SQL> create table blob_test( id number, content blob);
Table created.
(2) 插入数据
SQL> insert into blob_test values(1,'xiaowurq');
insert into blob_test values(1,'xiaowurq')
*
ERROR at line 1:
ORA-01465: invalid hex number
由报错可以看出,无法直接往 blob字段中插入数据,下面用UTL_RAW.CAST_TO_RAW 和
,RAWTOHEX 函数转换一下再插入。
SQL> insert into blob_testvalues(1,UTL_RAW.CAST_TO_RAW('xiaowurq'));
1 row created.
SQL> insert into blob_testvalues(2,RAWTOHEX('肖舞'));
1 row created.
SQL> select * from blob_test;
ID CONTENT
---------- --------------------------------------------------
1 7869616F77757271
2 D0A4CEE8
可以看到用两个函数转换,都可以插入成功,并且可以直接查询出来,但插入到数据库里面的结果为16进制数据,(注:11g 的数据库可以直接查出来, 10g 的无法直接查询 blob字段数据)。那么我们能直接往表中以16进制的方式插入数据吗?
SQL> insert into blob_test values(3,'7869616F77757271');
1 row created.
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test;
ID VAR1
---------- ------------------------------
1 xiaowurq
2 肖舞
3 xiaowurq
可以看出是可以直接往数据库里插入16进制数据的,并且我们可以看到用两种方式插入的结果是一致的。
(3) 下面是对 blob字段的修改操作,不再做过多解释。
SQL> update blob_test set content = RAWTOHEX('肖舞') whereid=3;
1 row updated.
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test;
ID VAR1
---------- ------------------------------
1 xiaowurq
2 肖舞
3 肖舞
SQL> update blob_test set content ='7869616F77757271D0A4CEE8' where id=3;
1 row updated.
SQL> select * from blob_test;
ID CONTENT
------------------------------------------------------------
1 7869616F77757271
2 D0A4CEE8
3 7869616F77757271D0A4CEE8
(4) 对 blob 字段的模糊查询。
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test where content like '%xiaowu%';
select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_testwhere content like '%xiaowu%'
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER gotBLOB
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test where content like '�A4CEE8%';
select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_testwhere content like '�A4CEE8%'
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER gotBLOB
有上面的两个命令和报错可以看出,无法对 blob 字段进行模糊查询,及时用16进制数据去匹配也不行,不过我们可以通过下面的方法实现对 blob 字段进行模糊匹配。
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('肖舞'),1,1) >0;
ID VAR1
---------- ------------------------------
2 肖舞
3 xiaowurq肖舞
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) >0;
Enter value for 1: xiaowu
old 1: selectid,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) >0
new 1: selectid,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('xiaowu'),1,1) >0
ID VAR1
---------- ------------------------------
1 xiaowurq
3xiaowurq肖舞
先介绍一下Oracle中RAW和 varchar2常用的两个转换函数
1. UTL_RAW.CAST_TO_RAW
该函数按照缺省字符集(一般为GB2312),将VARCHAR2字符串转换为RAW。
SQL> select UTL_RAW.CAST_TO_RAW('xiaowurq') from dual;
SQL> select UTL_RAW.CAST_TO_RAW('xiaowurq') raw1,UTL_RAW.CAST_TO_RAW('肖舞') raw2 from dual;
RAW1 RAW2
------------------------------------------------------------
7869616F77757271 D0A4CEE8
也可以用 rawtohex 函数实现:
SQL> select rawtohex('xiaowurq') raw1,rawtohex('肖舞') raw2from dual;
RAW1 RAW2
------------------------------ ------------------------------
7869616F77757271 D0A4CEE8
2.UTL_RAW.CAST_TO_VARCHAR2
该函数按照缺省字符集合(一般为GB2312),将RAW转换为VARCHAR2。
SQL> select UTL_RAW.CAST_TO_VARCHAR2('7869616F77757271')var1, UTL_RAW.CAST_TO_VARCHAR2('D0A4CEE8') var2 fromdual;
VAR1 VAR2
------------------------------------------------------------
xiaowurq 肖舞
其实RAW和VARCHAR是类似的,只是存储在RAW里的是二进制值,在任何时候不会做自动的字符集转换,这是RAW和VARCHAR的不同,RAW只是一种外部类型,其内部存储是VARRAW。
下面整体做个实验:
(1)创建表
SQL> create table blob_test( id number, content blob);
Table created.
(2) 插入数据
SQL> insert into blob_test values(1,'xiaowurq');
insert into blob_test values(1,'xiaowurq')
*
ERROR at line 1:
ORA-01465: invalid hex number
由报错可以看出,无法直接往 blob字段中插入数据,下面用UTL_RAW.CAST_TO_RAW 和
,RAWTOHEX 函数转换一下再插入。
SQL> insert into blob_testvalues(1,UTL_RAW.CAST_TO_RAW('xiaowurq'));
1 row created.
SQL> insert into blob_testvalues(2,RAWTOHEX('肖舞'));
1 row created.
SQL> select * from blob_test;
ID CONTENT
---------- --------------------------------------------------
1 7869616F77757271
2 D0A4CEE8
可以看到用两个函数转换,都可以插入成功,并且可以直接查询出来,但插入到数据库里面的结果为16进制数据,(注:11g 的数据库可以直接查出来, 10g 的无法直接查询 blob字段数据)。那么我们能直接往表中以16进制的方式插入数据吗?
SQL> insert into blob_test values(3,'7869616F77757271');
1 row created.
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test;
ID VAR1
---------- ------------------------------
1 xiaowurq
2 肖舞
3 xiaowurq
可以看出是可以直接往数据库里插入16进制数据的,并且我们可以看到用两种方式插入的结果是一致的。
(3) 下面是对 blob字段的修改操作,不再做过多解释。
SQL> update blob_test set content = RAWTOHEX('肖舞') whereid=3;
1 row updated.
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test;
ID VAR1
---------- ------------------------------
1 xiaowurq
2 肖舞
3 肖舞
SQL> update blob_test set content ='7869616F77757271D0A4CEE8' where id=3;
1 row updated.
SQL> select * from blob_test;
ID CONTENT
------------------------------------------------------------
1 7869616F77757271
2 D0A4CEE8
3 7869616F77757271D0A4CEE8
(4) 对 blob 字段的模糊查询。
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test where content like '%xiaowu%';
select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_testwhere content like '%xiaowu%'
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER gotBLOB
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test where content like '�A4CEE8%';
select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_testwhere content like '�A4CEE8%'
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER gotBLOB
有上面的两个命令和报错可以看出,无法对 blob 字段进行模糊查询,及时用16进制数据去匹配也不行,不过我们可以通过下面的方法实现对 blob 字段进行模糊匹配。
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('肖舞'),1,1) >0;
ID VAR1
---------- ------------------------------
2 肖舞
3 xiaowurq肖舞
SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) >0;
Enter value for 1: xiaowu
old 1: selectid,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) >0
new 1: selectid,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('xiaowu'),1,1) >0
ID VAR1
---------- ------------------------------
1 xiaowurq
3xiaowurq肖舞
相关文章推荐
- 关于sql查询字符char类型数据的条件使用
- 关于BLOB数据类型插入ORACLE数据库的操作(转)
- 学习操作oracle.sql.Blob数据类型,向数据库插入Blob数据类型的数据
- 关于 “不允许从数据类型 sql_variant 到 uniqueidentifier 的隐式转换。请使用 CONVERT 函数来运行此查询“的最终解决
- 关于BLOB数据类型插入ORACLE数据库的操作
- SqlServer XML 类型数据操作
- sql 关于文档的表中所有列、列的类型、列的说明、列字段等查询,表外键的查询
- java操作Oracle大数据类型BLOB的存取
- Hadoop Hive sql语法详解4--DQL 操作:数据查询SQL
- sql server BLOB数据类型介绍
- Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型
- 关于SQL查询效率,100w数据,查询只要1秒
- 用python操作mysql数据库(之数据查询结果返回字典类型)
- 关于SQL时间类型的模糊查询
- HQL和原生SQL查询的数据类型问题
- 关于从sql*plus中往数据库插入数据却查询不到的原因
- SQl查询数据库表名、表的列名、数据类型、主键
- 关于SQL查询的字符串类型字段的排序问题
- 数据统计例子,相关子查询!(SQL 中循环操作一列数据方法)
- 使用JDBC4.0操作Oracle中BLOB类型的数据方法