我个人会用CHR() http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions026.htm#SQLRF00616来识别空值。 nul 是 ASCII 0 并且CHR()
将返回您传入的数字的字符表示形式。
SQL> with the_data as (
2 select 'a' || chr(0) || 'b' as str from dual
3 union all
4 select 'a' || 'c' from dual
5 )
6 select dump(str)
7 from the_data
8 where str like '%' || chr(0) || '%'
9 ;
DUMP(STR)
----------------------------------------------------
Typ=1 Len=3: 97,0,98
正如您通过连接百分号所看到的CHR(0)
(相当于 nul)您可以返回带有 nul 的行。
DUMP() http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions055.htm#SQLRF00635返回数据类型(1 表示 VARCHAR2 http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#BABCGCHG) 字符串的长度(以字节为单位)和数据的内部表示;默认为二进制。
然而,你需要小心多字节数据 as CHR()
返回数字 256 模数的等效字符:
SQL> with the_data as (
2 select 'a' || chr(0) || 'b' as str from dual
3 union all
4 select 'a' || chr(256) || 'c' from dual
5 )
6 select dump(str)
7 from the_data
8 where str like '%' || chr(0) || '%'
9 ;
DUMP(STR)
-------------------------------------------------
Typ=1 Len=3: 97,0,98
Typ=1 Len=4: 97,1,0,99
正如你所看到的,你会在这里错误地识别出一个 nul,使用CHR()
or DUMP()
换句话说,如果您没有多字节数据,那么最简单的事情就是replace http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions153.htm#SQLRF00697 it:
update <table>
set <column> = replace(<column>, chr(0));
利用RAWTOHEX()
有类似的问题;虽然你可以找到00
不能保证它实际上是一个 nul:
SQL> with the_data as (
2 select 'a' || chr(0) || 'b' as str from dual
3 union all
4 select 'a' || chr(256) || 'c' from dual
5 )
6 select rawtohex(str)
7 from the_data
8 where str like '%' || chr(0) || '%'
9 ;
RAWTOHEX
--------
610062
61010063
它实际上还有一个更进一步的问题;想象你有两个角色10
and 06
那么返回值是1006
你会发现00
。如果要使用此方法,您必须确保只查看从字符串开头开始的两个字符组。
由于 nul 字符的内部表示用于表示其他多字节字符的一部分,因此您不能直接替换它们,因为您不知道它是一个字符还是半个字符。因此,如果您使用多字节字符集,据我所知,您将无法执行此操作。