Мы в настоящее время перемещаем одну из наших баз данных оракула к UTF8, и мы нашли несколько записей, которые являются около 4 000 байтов varchar пределом. Когда мы пытаемся мигрировать, они записывают, они перестали работать, поскольку они содержат символы, которые становятся многобайтовыми символами UF8. Что я хочу сделать в МН / SQL, определяют местоположение этих символов для наблюдения то, что они и затем или изменяют их или удаляют их.
Я хотел бы сделать:
SELECT REGEXP_REPLACE(COLUMN,'[^[:ascii:]],'')
но Oracle не реализует [: ASCII:] класс символов.
Существует ли простой способ делать то, что я хочу сделать?
В однобайтовой кодировке, совместимой с ASCII (например, Latin-1), символы ASCII - это просто байты в диапазоне от 0 до 127. Таким образом, вы можете использовать что-то вроде [\ x80- \ xFF]
для обнаружения символов, отличных от ASCII.
Возможно, существует более прямой способ использования регулярных выражений. Если повезет, кто-нибудь другой предоставит его. Но вот что я бы сделал без необходимости обращаться к руководствам.
Создайте функцию PLSQL для получения входной строки и верните varchar2.
В функции PLSQL сделайте asciistr() своего входного сигнала. В PLSQL это потому, что она может возвращать строку длиннее 4000 и у вас есть 32К для varchar2 в PLSQL.
Эта функция преобразует не-ASCII символы в нотацию \xxxx. Таким образом, вы можете использовать регулярные выражения для их поиска и удаления. Затем верните результат.
У меня была похожая проблема, и я писал об этом в блоге здесь . Я начал с регулярного выражения для буквенно-цифровых символов, затем добавлены несколько основных знаков пунктуации, которые мне понравились:
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.