個人的には、 CHR()
nul値を識別します。 nulはASCII0および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と同等です)nulinを含む行を返すことができます。
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
ご覧のとおり、CHR()
のいずれかを使用して、ここで誤ってnulを識別します。 またはDUMP()
つまり、マルチバイトデータがない場合、最も簡単な方法は交換 それ:
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
の2文字があると想像してください および06
その場合、戻り値は1006
になります。 00
が見つかります 。この方法を使用する場合は、文字列の先頭から2つの文字グループのみを確認する必要があります。
ヌル文字の内部表現は他のマルチバイト文字の一部を表すために使用されるため、1文字なのか半分の文字なのかわからないため、単に置き換えることはできません。したがって、マルチバイト文字セットを使用している場合、私が知る限り、これを行うことはできません。