Нахождение и удаление не символы ASCII от Oracle Varchar2

Мы в настоящее время перемещаем одну из наших баз данных оракула к UTF8, и мы нашли несколько записей, которые являются около 4 000 байтов varchar пределом. Когда мы пытаемся мигрировать, они записывают, они перестали работать, поскольку они содержат символы, которые становятся многобайтовыми символами UF8. Что я хочу сделать в МН / SQL, определяют местоположение этих символов для наблюдения то, что они и затем или изменяют их или удаляют их.

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

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

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

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

25
задан FerranB 12 February 2010 в 22:23
поделиться

3 ответа

В однобайтовой кодировке, совместимой с ASCII (например, Latin-1), символы ASCII - это просто байты в диапазоне от 0 до 127. Таким образом, вы можете использовать что-то вроде [\ x80- \ xFF] для обнаружения символов, отличных от ASCII.

7
ответ дан 28 November 2019 в 18:04
поделиться

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

Создайте функцию PLSQL для получения входной строки и верните varchar2.

В функции PLSQL сделайте asciistr() своего входного сигнала. В PLSQL это потому, что она может возвращать строку длиннее 4000 и у вас есть 32К для varchar2 в PLSQL.

Эта функция преобразует не-ASCII символы в нотацию \xxxx. Таким образом, вы можете использовать регулярные выражения для их поиска и удаления. Затем верните результат.

3
ответ дан 28 November 2019 в 18:04
поделиться

У меня была похожая проблема, и я писал об этом в блоге здесь . Я начал с регулярного выражения для буквенно-цифровых символов, затем добавлены несколько основных знаков пунктуации, которые мне понравились:

select dump(a,1016), a, b
from
 (select regexp_replace(COLUMN,'[[:alnum:]/''%()> -.:=;[]','') a,
         COLUMN b
  from TABLE)
where a is not null
order by a;

Я использовал дамп с вариантом 1016, чтобы выдать шестнадцатеричные символы, которые я хотел заменить, которые затем можно было использовать в utl_raw.cast_to_varchar2.

2
ответ дан 28 November 2019 в 18:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: