Я работаю с данными из старой базы данных mysql. В этой базе данных есть таблица со строковым столбцом с кодировкой «cp1252 западноевропейский (latin1)» (такой же, как Windows-1252). При запросе данных из командной строки mysql данные из этого поля представлены в виде:
Obama’s
Это должно читать
Obama's
Я пробовал следовать принятому ответу « Как конвертировать весь набор символов базы данных MySQL и сопоставление с UTF-8? для преобразования поля в UTF-8 в MySQL, но это не имеет значения.
Я также попытался вставить новую строку в эту таблицу, используя Obama's
качестве текста для этого поля (опять же из командной строки mysql). Однако этот текст правильно представлен, когда я затем запрашиваю ту же строку, которую я только что вставил. Я попытался выполнить эту вставку, когда поле было установлено на latin1 и когда оно было установлено в UTF-8. Тот же результат.
Это заставляет меня думать, что когда плохие данные были вставлены в базу данных, это было сначала неправильно закодировано PHP. Здесь он становится нечетким для меня.
Я могу предположить, что данные были вставлены через веб-форму и обработаны с помощью PHP. Что сделал PHP с ним, прежде чем вставлять его в базу данных? Преобразовал ли он строку в UTF-8, которая, согласно таблице на этой полезной странице , использует три байта %E2 %80 %99
для представления символа. У меня есть это право?
Если это правильно, каковы мои варианты восстановления этих данных? Я хотел бы преобразовать таблицу и ее поля в кодировки UTF-8, но это, похоже, не исправляет текст. Должен ли я писать сценарий, который вручную изменяет эти символы, какими они должны быть?
select convert(binary convert(field_name using latin1) using utf8) from table_name
Если это отобразится правильно, вы можете выполнить обновление.