2016-09-30 2 views
0

Хотя я настроил свое веб-приложение для полного соответствия UTF8, я забыл указать кодировку UTF-8 в настройках PDO ... Случается, что китайские персонажи выглядят странно в базе данных/phpmyadmin (ä½ å ¥ ½ для 你好), хотя они отлично смотрятся в моем веб-приложении.Исправлена ​​база данных, закодированная через PDO без указания кодировки UTF8

Как я, наконец, знаю решение (чтобы добавить кодировку в настройках соединения PDO), я хотел бы знать, есть ли простой способ преобразования моих старых данных в правильный UTF-8. Я нашел на Stackoverflow следующего кода, который делает работу, но он решает кодирования столбца проблемы на столбец, таблицу на стол ..

UPDATE tablename SET 
field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8); 

она существует ли способ выполнить такое преобразование ко всей базе данных?

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

Спасибо!

+0

Прежде всего, давайте посмотрим 'SHOW CREATE TABLE' и' SELECT col, HEX (col) ... 'для некоторого искаженного текста. Это необходимо для того, чтобы определить, является ли это Mojibake или Double Encoding (что более беспорядочно исправлять). См. [_this_] (http://stackoverflow.com/a/38363567/1766831) для обсуждения. –

+0

И, поскольку вы используете китайский язык, вам понадобится utf8mb4, а не только utf8. –

+0

Привет, Рик, большое спасибо за ваши отзывы. Вот результаты, которые я получаю: С SHOW CREATE TABLE у меня есть DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci в конце моей структуры таблицы. И для HEX (col), я получаю длинные строки, начиная с C, что, кажется, для Западной Европы. – Pierre

ответ

1

У вас есть «двойное кодирование». Я считаю, что эти шаги 'вызвали' это:

  1. байтов (для, скажем, 你好) должны быть сохранены были правильно закодированы utf8 (E4BDA0 E5A5BD).
  2. CHARACTER SET для столбца был правильно utf8 (или utf8mb4). (Возможно, это был latin1, с тем же результатом.)
  3. «Соединение» было установлено на latin1, когда вы INSERTed. Здесь была ошибка. Это заявляло, что хранящиеся данные кодируются как latin1, эти 6 символов: hex E4 BD A0 E5 A5 BD. Во время хранения они были преобразованы в кодировку столбцов (utf8), чтобы стать C3A4 C2BD C2A0 C3A5 C2A5 C2BD.
  4. Вы правильно указали SELECTed данные как utf8. Но, к настоящему времени, это дало вам этот беспорядок: 你好.

Две вещи неправы; оба требуют фиксации одновременно:

  • Шаг 2 нуждается в изменении, чтобы установить, что UTF-8 является кодировкой клиента. См. PHP. Сделайте что-то вроде $db = new PDO('dblib:host=host;dbname=db;charset=UTF8', $user, $pwd); для PDO.
  • Данные нуждаются в фиксации. Ваш UPDATE выглядит хорошо для этот кейс.
+0

Для других случаев преобразования http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases –

Смежные вопросы