Поиск и удаление не ascii символов из Oracle Varchar2 - PullRequest
24 голосов
/ 10 февраля 2010

В настоящее время мы переносим одну из наших баз данных Oracle в UTF8, и мы нашли несколько записей, которые близки к пределу 4000 байтов varchar. Когда мы пытаемся перенести эти записи, они терпят неудачу, так как содержат символы, которые становятся многобайтовыми символами UF8. В PL / SQL я хочу найти эти символы, чтобы увидеть, какие они есть, а затем либо изменить их, либо удалить их.

Я бы хотел сделать:

SELECT REGEXP_REPLACE(COLUMN,'[^[:ascii:]],'')

но Oracle не реализует класс символов [: ascii:].

Есть ли простой способ делать то, что я хочу?

Ответы [ 16 ]

0 голосов
/ 22 ноября 2016

Вы можете попробовать что-то вроде следующего, чтобы найти столбец, содержащий не-ascii символ:

select * from your_table where your_col <> asciistr(your_col);
0 голосов
/ 06 ноября 2015

Я немного опоздал с ответом на этот вопрос, но в последнее время у меня возникла та же проблема (люди вырезали и вставляли в строку все что угодно, и мы не всегда знаем, что это такое). Ниже приведен простой подход к списку символов:

SELECT est.clients_ref
  ,TRANSLATE (
              est.clients_ref
             ,   'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
              || REPLACE (
                          TRANSLATE (
                                     est.clients_ref
                                    ,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
                                    ,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
                                    )
                         ,'~'
                         )
             ,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
             )
      clean_ref

ОТ edms_staging_table est

0 голосов
/ 01 ноября 2015

Обратите внимание, что всякий раз, когда вы используете

regexp_like(column, '[A-Z]')

Механизм регулярных выражений Oracle также будет соответствовать определенным символам из диапазона Latin-1: это относится ко всем символам, которые похожи на символы ASCII, такие как Ä-> A, Ö-> O, Ü-> U и т. Д., Поэтому что [AZ] не то, что вы знаете из других сред, таких как, например, Perl.

Вместо того, чтобы возиться с регулярными выражениями, попробуйте изменить тип данных NVARCHAR2 до обновления набора символов.

Другой подход: вместо того, чтобы вырезать часть содержимого полей, вы можете попробовать функцию SOUNDEX, при условии, что ваша база данных содержит только европейские символы (т. Е. Latin-1). Или вы просто пишете функцию, которая переводит символы из диапазона Latin-1 в похожие символы ASCII, например

  • å => a
  • ä => a
  • ö => o

конечно, только для текстовых блоков, превышающих 4000 байт при преобразовании в UTF-8.

0 голосов
/ 05 августа 2015

Сделай это, это сработает.

trim(replace(ntwk_slctor_key_txt, chr(0), ''))
0 голосов
/ 30 августа 2014

Спасибо, это сработало для моих целей. Кстати, в приведенном выше примере отсутствует одиночная кавычка.

REGEXP_REPLACE (COLUMN, '[^' || CHR (32) || '-' || CHR (127) || ']', ''))

Я использовал его в функции переноса слов. Иногда во входящем тексте была встроенная NewLine / NL / CHR (10) / 0A, которая все испортила.

0 голосов
/ 23 апреля 2014

Ответ, данный Франсиско Хайоз, - лучший. Не используйте функции pl / sql, если sql может сделать это за вас.

Вот простой тест в Oracle 11.2.03

select s
     , regexp_replace(s,'[^'||chr(1)||'-'||chr(127)||']','') "rep ^1-127"
     , dump(regexp_replace(s,'['||chr(127)||'-'||chr(225)||']','')) "rep 127-255"
from (
select listagg(c, '') within group (order by c) s
  from (select 127+level l,chr(127+level) c from dual connect by level < 129))

А "повтор 127-255" равен

Тип = 1 Len = 30: 226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255

Т.е. по какой-то причине эта версия Oracle не заменяет char (226) и выше. Использование '[' || chr (127) || '-' || chr (225) || ']' дает желаемый результат. Если вам нужно заменить другие символы, просто добавьте их в приведенное выше регулярное выражение или используйте вложенную замену | regexp_replace, если замена отличается от '' (пустая строка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...