Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để loại bỏ các ký tự NUL trong cơ sở dữ liệu Oracle?

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ự 1006 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các câu lệnh DDL có luôn cung cấp cho bạn một cam kết ngầm hay bạn có thể nhận được một lần khôi phục ngầm không?

  2. Hình ảnh định dạng ngày Oracle kết thúc trước khi chuyển đổi toàn bộ chuỗi đầu vào

  3. Làm thế nào để đặt tên bảng oracle không phân biệt chữ hoa chữ thường?

  4. Truy cập / phản lực tương đương với giải mã của Oracle

  5. làm thế nào để chuyển đổi ngày thành số tháng?