Cá nhân tôi sử dụng CHR()
để xác định các giá trị nul. Một nul là ASCII 0 và CHR()
sẽ trả về đại diện ký tự của số bạn nhập vào.
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
Như bạn có thể thấy bằng cách nối các dấu phần trăm xung quanh CHR(0)
(tương đương với nul) bạn có thể trả về các hàng có nul in.
DUMP()
trả về kiểu dữ liệu ( 1 nghĩa là VARCHAR2 ) độ dài của chuỗi tính bằng byte và biểu diễn bên trong của dữ liệu; mặc định là nhị phân.
Tuy nhiên, bạn cần phải cẩn thận với dữ liệu nhiều byte dưới dạng CHR()
trả về ký tự tương đương với mô-đun 256 của số:
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
Như bạn có thể thấy, bạn sẽ nhầm lẫn khi xác định một nul ở đây, bằng cách sử dụng CHR()
hoặc DUMP()
Nói cách khác, nếu bạn không có dữ liệu multibyte thì việc đơn giản nhất là thay thế nó:
update <table>
set <column> = replace(<column>, chr(0));
Sử dụng RAWTOHEX()
có vấn đề tương tự; mặc dù bạn có thể tìm thấy 00
không có gì đảm bảo rằng nó thực sự là một 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
Nó thực sự còn có một vấn đề nữa; hãy tưởng tượng bạn có hai ký tự 10
và 06
giá trị trả về sau đó là 1006
và bạn sẽ tìm thấy 00
. Nếu bạn sử dụng phương pháp này, bạn phải đảm bảo rằng bạn chỉ xem xét hai nhóm ký tự, từ đầu chuỗi.
Vì biểu diễn bên trong của một ký tự nul được sử dụng để đại diện cho các phần của các ký tự đa byte khác, bạn không thể thay thế chúng vì bạn không biết đó là một ký tự hay một nửa ký tự. Vì vậy, nếu bạn đang sử dụng bộ ký tự nhiềubyte, theo như tôi biết, bạn sẽ không thể làm được điều này.