Secara pribadi saya akan menggunakan CHR()
untuk mengidentifikasi nilai nol. Sebuah nul adalah ASCII 0 dan CHR()
akan mengembalikan representasi karakter dari nomor yang Anda masukkan.
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
Seperti yang Anda lihat dengan menggabungkan tanda persentase di sekitar CHR(0)
(yang setara dengan nul) Anda dapat mengembalikan baris dengan nul in.
DUMP()
mengembalikan tipe data (1 berarti VARCHAR2 ) panjang string dalam byte dan representasi internal data; defaultnya adalah biner.
Namun, Anda harus berhati-hati dengan data multibyte sebagai CHR()
mengembalikan karakter yang setara dengan modulus 256 angka:
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
Seperti yang Anda lihat, Anda akan salah mengidentifikasi nul di sini, menggunakan CHR()
atau DUMP()
Dengan kata lain, jika Anda tidak memiliki data multibyte maka hal yang paling mudah dilakukan adalah ganti itu:
update <table>
set <column> = replace(<column>, chr(0));
Memanfaatkan RAWTOHEX()
memiliki masalah serupa; meskipun Anda dapat menemukan 00
tidak ada jaminan bahwa itu benar-benar nol:
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
Ini sebenarnya memiliki masalah lebih lanjut juga; bayangkan Anda memiliki dua karakter 10
dan 06
nilai yang dikembalikan kemudian 1006
dan Anda akan menemukan 00
. Jika Anda menggunakan metode ini, Anda harus memastikan bahwa Anda hanya melihat dua grup karakter, dari awal string.
Karena representasi internal dari karakter nul digunakan untuk mewakili bagian dari karakter multibyte lainnya, Anda tidak bisa begitu saja menggantinya karena Anda tidak tahu apakah itu satu karakter atau setengah karakter. Jadi, jika Anda menggunakan kumpulan karakter multibyte, sejauh yang saya tahu, Anda tidak akan dapat melakukannya.