就个人而言,我会使用CHR()来识别零值。 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)周围的百分比符号CHR(0)相当于nul),您可以返回带有nul的行。
DUMP()返回数据类型( 1表示VARCHAR2 )字符串的长度(以字节为单位)和数据的内部表示形式; 默认为二进制。
但是, 您需要注意多字节数据,因为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()或DUMP()
换句话说,如果您没有多字节数据,那么最简单的方法就是替换它:
update
set = replace(, chr(0));
使用RAWTOHEX()有类似的问题; 虽然你可以找到00但不能保证它实际上是一个零点:
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和06 ,返回的值是1006 ,你会找到00 。 如果您要使用此方法,则必须确保仅从字符串的开头查看两个字符组。
由于nul字符的内部表示用于表示其他多字节字符的部分,因此您不能只替换它们,因为您不知道它是一个字符还是半个字符。 因此,如果您使用多字节字符集,据我所知,您将无法执行此操作。