Почему не работает перевод на некоторых персонажах?

Я пытаюсь удалить определенные символы из VARCHAR2 с помощью перевода. Однако символы 160 (какой-то пробел) и 243 (символ управления абзацем?) кажутся «фантомными» символами, которые не обнаруживаются ни INSTR, ни TRANSLATE. LENGTH работает, но только если это единственный символ в строке. LENGTH(CHR(160)) возвращает 1, но LENGTH(CHR(160) || CHR(110)) также возвращает 1, хотя вы думали, что он вернет 2. Я обнаружил, что REPLACE работает при удалении этих фантомных символов из строки, но мне нравится лучше переводить, потому что его легче читать и поддерживать, тогда как длинное вложение или функции REPLACE просто громоздки.

Есть ли другой способ удалить эти символы из VARCHAR2 без использования замены?

РЕДАКТИРОВАТЬ: похоже, что символ 243 в другом месте регистрируется как . Однако у Oracle нет проблем с отображением этого символа, когда я выбрал его явно. Когда я выбираю CHR(243), он просто отображает символ замены блока. Кроме того, этот источник указывает 243 на символ абзаца, который имеет больше смысла, поскольку это управляющий код.


person oscilatingcretin    schedule 06.03.2014    source источник
comment
ASCIISTR() мог их вырезать..   -  person Maheswaran Ravisankar    schedule 06.03.2014
comment
@OracleUser Это на самом деле становится ближе. Однако он не удаляет неподдерживаемые символы, а вместо этого преобразует их в \FFFD\FFFD. Если он может преобразовать их, само собой разумеется, что он также может их удалить. Я не могу использовать регулярное выражение, если \FFFD когда-либо является допустимой строкой в ​​столбце.   -  person oscilatingcretin    schedule 06.03.2014
comment
Можете ли вы дать мне dump(your_column) для образца?   -  person Maheswaran Ravisankar    schedule 06.03.2014
comment
Вот пример: select dump('沈阳市' || chr(160) || chr(243) || chr(15712189) || chr(15556979) || chr(15300713)) from dual; Мне также нужно поддерживать символы кандзи, поэтому я не знаю, будет ли работать ASCIISTR.   -  person oscilatingcretin    schedule 06.03.2014
comment
выберите длину (chr (160) || chr (110)) из двойного; Возвращает 2 в моей базе данных.   -  person Rene    schedule 12.03.2014


Ответы (1)


Как насчет использования регулярного выражения? Это удалит ваши проблемные символы, заменив символы 160 или 243 ничем:

SQL> select regexp_replace('abc' || chr(160) || chr(243) || 'def', '(' || chr(160) || '|' || chr(243) || ')', '') from dual;

REGEXP
------
abcdef

SQL>
person Gary_W    schedule 12.03.2014