sql >> Databáze >  >> RDS >> Oracle

Jak se zbavit znaků NUL v databázi Oracle?

Osobně bych použil CHR() k identifikaci hodnot nul. A nul je ASCII 0 a CHR() vrátí znakové vyjádření čísla, které předáte.

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

Jak můžete vidět zřetězením znaků procenta kolem CHR(0) (což je ekvivalentní nul) můžete vrátit řádky s nul in.

DUMP() vrátí datový typ (1 znamená VARCHAR2 ) délka řetězce v bajtech a vnitřní reprezentace dat; výchozí je binární.

Nicméně je třeba dávat pozor na vícebajtová data jako CHR() vrátí znakový ekvivalent modulu 256 čísla:

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

Jak vidíte, omylem byste zde identifikovali nul pomocí buď CHR() nebo DUMP()

Jinými slovy, pokud nemáte vícebajtová data, nejjednodušší je jednoduše nahradit to:

update <table>
   set <column> = replace(<column>, chr(0));

Pomocí RAWTOHEX() má podobné problémy; i když můžete najít 00 neexistuje žádná záruka, že je to skutečně nula:

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

Ve skutečnosti má také další problém; představte si, že máte dva znaky 10 a 06 vrácená hodnota je pak 1006 a najdete 00 . Pokud byste použili tuto metodu, musíte se ujistit, že jste se podívali pouze na dvě skupiny znaků od začátku řetězce.

Protože se vnitřní reprezentace znaku nul používá k reprezentaci částí jiných, vícebajtových znaků, nemůžete je jednoduše nahradit, protože nevíte, zda se jedná o jeden znak nebo polovinu znaku. Pokud tedy používáte vícebajtovou znakovou sadu, pokud vím, nebudete toho schopni.



  1. Jak automatizovat Galera Cluster pomocí ClusterControl CLI

  2. Načíst TOP 10 řádků bez použití TOP nebo LIMIT? – Otázka týdne v rozhovoru č. 247

  3. Rozdělte jednu hodnotu sloupce na více hodnot sloupce

  4. Seskupování dat do různých tabulek na základě minimálního data události