заменить мусорные символы в MySQL - PullRequest
1 голос
/ 14 февраля 2012

Моя база данных находится в latin1 и полна â" или '��"' (в зависимости от того, установлен ли мой терминал на latin1 или unicode, соответственно). Исходя из контекста, я думаю, что они должны быть эмдаши Похоже, что они вызывают неприятные ошибки, когда отображаются (или не отображаются) в IE. Я хотел бы найти и заменить их. Проблема в том, что ни символы â, ни match не совпадают с replace. Выполнение запроса:

    update TABLE set COLUMN = replace(COLUMN,'��"','---');

Выполняется без ошибок, но ничего не делает (изменено 0 строк). Мне ясно, что символ «знак вопроса в ромбе» не совпадает, когда я копирую его в терминал. Есть ли способ узнать его код и сопоставить его с этим или что-то? Консоль mysql невероятно близка к возможности сделать это в одну строку, поэтому я бы не стал писать сценарии вне терминала, если смогу избежать этого.

БД размещена на Amazon RDS, поэтому я не могу установить регулярное выражение udf, на которое я видел ссылки в других вопросах здесь. В долгосрочной перспективе мне нужно будет должным образом преобразовать всю базу данных в utf8, но мне нужно исправить эту проблему сразу.

EDIT:

Я выделил плохого персонажа с помощью hexdump, это e2 80 (я не думаю, что это соответствует какому-либо юникодному символу). Как я могу передать это функции замены?

    update TABLE set COLUMN = replace(COLUMN, char(0xe2,0x80),'---');

ничего не делает.

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Я понял это. Я использовал встроенную функцию mysql hex для вывода записи, которую я считал плохой.

    select hex(column) from table where id=666;

Затем выбрал слова (эти числа зажаты между «20») и обнаружил, что мой оскорбительный набор байтов был на самом деле x'C3A2E282AC2671756F743B'. Насколько это соответствует тому, как я это видел в PHP и моей системе (как e2 80), я не знаю, и на данный момент мне все равно.

Чтобы проверить, прежде чем уничтожать данные, вы подключаете их обратно к mysql:

    select x'C3A2E282AC2671756F743B';
    +---------------------------+
    | x'C3A2E282AC2671756F743B' |
    +---------------------------+
    | â€"               |
    +---------------------------+
    1 row in set (0.00 sec)

Итак, используя запрос на замену, как описано выше, я смог избавиться от всех неверных данных одновременно.

Для записи это было:

    update TABLE set COLUMN = replace(COLUMN, x'C3A2E282AC2671756F743B','--');

Я действительно надеюсь, что это кому-нибудь пригодится. Несмотря на то, что кодирование snafus довольно часто встречается в mysql, я искал везде и не смог найти объяснения этому чрезвычайно простому процессу.

0 голосов
/ 14 февраля 2012

Возможно, что-то передало знак тире em (U + 2014) с кодировкой UTF-8 (E2 80 94), который вы сейчас пытаетесь интерпретировать как latin-1, однако это неверно в latin-1, который исключаетдиапазон 80-9F, так что вы, вероятно, вместо этого увидите заменяющие символы Unicode для недопустимых байтов, что приводит к â�� при его отображении.Для сравнения в Windows-1252 он будет отображаться как —.

. Вы можете использовать CHAR(0xE2, 0x80, 0x94) для создания строки поиска.

...