Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara menghilangkan karakter NUL di database Oracle?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendapatkan jejak tumpukan kesalahan MySQL pada Koneksi Oracle JDBC

  2. Fungsi CURRENT_DATE di Oracle

  3. Pengidentifikasi tidak valid Oracle tidak mengerti string

  4. Cara Mengembalikan Daftar Zona Waktu yang Valid di Oracle Database

  5. Cara mengembalikan patch setelah fase cutover gagal di R12.2