Подтвердить что ты не робот

Как распознавать символы UTF-8 в кодированном латинском столбце - MySQL

Я собираюсь выполнить утомительную и загруженную задачу преобразования базы данных с Latin1 на UTF-8.

В этот момент я просто хочу проверить, какие данные я сохранил в своих таблицах, поскольку это определит, какой подход я должен использовать для преобразования данных.

В частности, я хочу проверить, есть ли у меня символы UTF-8 в столбцах Latin1, что было бы лучшим способом сделать это? Если затронуто только несколько строк, я могу просто исправить это вручную.

Вариант 1. Выполните дамп MySQL и используйте Perl для поиска символов UTF-8?

Вариант 2. Использовать MySQL CHAR_LENGTH для поиска строк с многобайтовыми символами? например SELECT name FROM clients WHERE LENGTH(name) != CHAR_LENGTH(name); Достаточно ли этого?

В настоящее время я переключил свою клиентскую кодировку Mysql на UTF-8.

4b9b3361

Ответ 1

Кодировка символов, например часовые пояса, является постоянным источником проблем.

Что вы можете сделать, это искать любые символы с высоким уровнем ASCII, так как они являются символами или символами LATIN1 с акцентом или первым из многобайтового символа UTF-8. Говорить о разнице не будет легко, если вы не обманете немного.

Чтобы выяснить, какая кодировка верна, вы просто SELECT две разные версии и сравниваете визуально. Вот пример:

SELECT CONVERT(CONVERT(name USING BINARY) USING latin1) AS latin1, 
       CONVERT(CONVERT(name USING BINARY) USING utf8) AS utf8 
FROM users 
WHERE CONVERT(name USING BINARY) RLIKE CONCAT('[', UNHEX('80'), '-', UNHEX('FF'), ']')

Это сделано необычно сложно, потому что механизм MySQL regexp, похоже, игнорирует такие вещи, как \x80, и вместо этого необходимо использовать метод UNHEX().

Это приводит к следующим результатам:

latin1                utf8
----------------------------------------
Björn                Björn

Ответ 2

Поскольку ваш вопрос не совсем ясен, допустим некоторые сценарии:

  • Неправильное подключение:. Вы неправильно подключили свою базу данных с использованием кодировки latin1, но сохранили данные UTF-8 в базе данных (в этом случае кодировка столбца не имеет значения), В этом случае я описал здесь. В этом случае легко исправить: сбрасывать содержимое базы данных в файл через соединение latin1. Это приведет к переводу неправильно сохраненных данных в неправильно правильно сохраненный UTF-8, так, как он работал до сих пор (прочитайте приведенную выше статью для деталей gory). Вы можете затем reimport данные в базу данных через правильно установленное соединение utf8, и оно будет храниться так, как должно быть.
  • Неправильная кодировка столбца: Данные UTF-8 были вставлены в столбец latin1 через соединение utf8. В этом случае забудьте об этом, данные исчезли. Любой символ не-latin1 должен быть заменен на ?.
  • До сих пор все прекрасно, в дальнейшем добавлена ​​поддержка UTF-8: У вас есть данные Latin-1, правильно сохраненные в столбце latin1, вставленные через соединение latin1, но вы хотите расширить это, чтобы также разрешить UTF -8. В этом случае просто измените кодировку столбца на utf8. MySQL будет конвертировать существующие данные для вас. Затем просто убедитесь, что ваше соединение с базой данных установлено на utf8 при вставке данных UTF-8.

Ответ 3

Существует a script в github, чтобы помочь в этом.

Ответ 4

Я бы создал дамп базы данных и grep для всех допустимых последовательностей UTF8. Где взять его оттуда, зависит от того, что вы получите. На SO есть несколько вопросов об идентификации недопустимого UTF8; вы можете в принципе просто отменить логику.

Изменить. В принципе, любое поле, состоящее полностью из 7-разрядного ASCII, безопасно, и любое поле, содержащее недопустимую последовательность UTF-8, можно считать латинским-1. Остальные данные должны быть проверены - если вам повезет, несколько очевидных замещений зафиксируют абсолютное большинство (замените ¶ на латинский-1 ö и т.д.).