Выбрать странные символы в тексте, не работает с оператором LIKE - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь использовать это решение и это (для str_eval()), но, похоже, другой код или другой UTF8 Форма нормализации , возможно, объединение диакритические знаки ...

select distinct  logradouro, str_eval(logradouro)  
from logradouro where logradouro like '%CECi%';
--         logradouro         |          str_eval
------------------------------+----------------------------
-- AV CECi\u008DLIA MEIRELLES | AV CECi\u008DLIA MEIRELLES

ПРОБЛЕМА : как выделить все строки таблицы, где существует проблема? То есть где встречается \u?

  • не работает с like '%CECi\u%' ни like '%CECi\\u%'
  • работает с like E'%CECi\u008D%', но не является общим c

Для Google отредактировано после решенного вопроса: это типичная проблема XY . В исходном вопросе (выше) я использовал ~ неправильную гипотезу . Все приведенные ниже решения являются ответами на следующий (объективный) вопрос:

Как выбрать только печатный текст ASCII?

« Printable ASCII » - это подмножество UTF8, это "весь код ASCII, который не является" управляющим символом "" .

"Непечатаемые" управляющие символы - это шестнадцатеричные символы UNICODE от 00 до 1F и 7F (HTML объект � до  +  или десятичный от 0 до 31 + 127).

PS1: ноль (�) - это отметка «конец текста» символа PostgreSQL текст внутреннее представление типа данных, поэтому не нужно проверять, но нет проблем, чтобы включить его в диапазон.

PS2: о второстепенном вопросе «как преобразовать слово с ошибкой кодирования в допустимое слово? ", см. heuristi c на мой ответ .

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Это условие исключает любые строки, которые не полностью состоят из печатаемых символов ASCII:

logradouro ~ '[^\u0020-\u007E]'
1 голос
/ 16 июня 2020

Решение с обходным путем

select distinct  logradouro, str_eval(logradouro)
from logradouro where not(logradouro ~ E'^[a-zA-Z0-9_,;\\- \\.\\(\\)\\/"\'\\*]+$');

Существует систематическая c ошибка при кодировании, нет возможности преобразовать в правильный UTF8 ... Даже при преобразовании проблема в том, что "CECi \ u008DLIA" не "Сесилия".

Решение состоит в том, чтобы использовать своего рода «корректор заклинаний heuristi c» на

regexp_replace(logradouro, E'[^a-zA-Z0-9_,;\\- \\.\\(\\)\\/"\'\\*]+', '!')

Пример: i! в «Ceci! Lia» исправлено на í .


УВЕДОМЛЕНИЕ. Любое решение heuristi c (или нейронная сеть), обученное с использованием определенного набора данных c (с указанием c systemati c error source), является черным ящиком решением, действительно только для этого типа систематики c ошибка . Для этого типа проблемы нет обобщения.

...