Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да се отърва от NUL символи в базата данни на Oracle?

Лично аз бих използвал CHR() за идентифициране на нулевите стойности. Нула е ASCII 0 и CHR() ще върне символното представяне на номера, който подавате.

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

Както можете да видите чрез свързване на знаци за процент около CHR(0) (което е еквивалентно на nul) можете да върнете редове с nul в.

DUMP() връща типа данни (1 означава VARCHAR2 ) дължината на низа в байтове и вътрешното представяне на данните; по подразбиране е двоично.

Все пак трябва да внимавате с многобайтови данни като CHR() връща символния еквивалент на модула от 256 на числото:

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

Както можете да видите, погрешно бихте идентифицирали нула тук, като използвате CHR() или DUMP()

С други думи, ако нямате многобайтови данни, най-лесното нещо, което можете да направите, е просто замяна то:

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

Използване на RAWTOHEX() има подобни проблеми; въпреки че можете да намерите 00 няма гаранция, че всъщност е нула:

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

Всъщност има и допълнителен проблем; представете си, че имате два знака 10 и 06 тогава върнатата стойност е 1006 и ще намерите 00 . Ако трябваше да използвате този метод, трябва да сте сигурни, че сте прегледали само две групи знаци от началото на низа.

Тъй като вътрешното представяне на нулев знак се използва за представяне на части от други, многобайтови знаци, не можете просто да ги замените, тъй като не знаете дали е един знак или половин знак. Така че, ако използвате многобайтов набор от знаци, вие, доколкото знам, няма да можете да направите това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да актуализирам колона от вложена таблица в pl/sql?

  2. Копиране на данни от LOB колона в дълга необработена колона

  3. прагма autonomous_transaction в тригер

  4. Свържете се с база данни Oracle 10g с Microsoft ODBC за Oracle

  5. Заявка за множество актуализации на Oracle