2015-06-30 4 views
1

Я использую PHP и MySQL для сохранения арабских данных.Обновление данных в базе данных MySQL после вставки неправильной кодировки

Моя сверка базы данных: utf8_general_ci

Мой набор баз данных Персонаж: utf8

Сначала я не использовал SET NAMES utf8 перед вставкой, так что данные были вставлены в странные символы в базе данных, но отображалось правильно в мое заявление. После использования SET NAMES utf8 данные вставляются правильно, но старые данные не отображаются на арабском языке даже в моем приложении (новые данные в порядке).

Как я могу обновить все данные, которые будут отображаться арабскими буквами как в моем приложении, так и в базе данных MySQL?

Update

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

Вот пример из двух строк:

текст вставляется: الإسم بالعربية текст Мне нужно преобразовать: الإسم بالعربية

+0

См http://stackoverflow.com/questions/279170/utf-8-all-the-way -through/279279 # 279279 - Если этого недостаточно, предоставьте пример вместе с 'SELECT col, HEX (col) FROM table WHERE ...', чтобы проверить, правильно ли он был сохранен. –

+0

это пример строки: значение Col: 'ا٫диаметр ¥ Ø³Ù ... با٠«Ø¹Ø ± Ø¨ÙŠØ ©' НЕХ (COL) Значение: 'C398C2A7C399E2809EC398C2A5C398C2B3C399E280A620C398C2A8C398C2A7C399E2809EC398C2B9C398C2B1C398C2A8C399C5A0C398C2A9' –

ответ

2

Вы страдаете от «двойного кодирования».

Вот что произошло.

  • У клиента были символы, кодированные как utf8; и
  • SET NAMES latin1 лгал, утверждая, что клиент имел кодировку latin1; и
  • Столбец в таблице объявлен CHARACTER SET utf8.

Давайте рассмотрим, что происходит с e-острым: é.

  1. Громкость для этого в utf8 составляет 2 байта: C3A9.
  2. SET NAMES latin1 видел его в качестве 2-latin1 в кодировке символовÃ и © (Hex: C3 и A9)
  3. Поскольку цель была CHARACTER SET utf8, эти 2 символов, необходимых для преобразования. Ã был преобразован в utf8 (шестнадцатиричное C383) и © (шестнадцатиричное C2A9)
  4. Так, 4 байта были сохранены (шестнадцатиричное C383C2A9)

При чтении его обратно, были выполнены обратные шаги, и тому конечный пользователь, возможно, ничего не заметил. Что не так:

  • Данные хранятся в 2 раза больше, чем должно быть (3x для азиатских языков).
  • Сравнения для равных, больших и т. Д. Могут не работать должным образом.
  • ORDER BY может не работать должным образом.

Что-то, как это будет восстановить ваши данные:

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
         CONVERT(UNHEX(col) USING utf8) 
         USING latin1)) USING utf8); 

More discussion и More examples of fixing it

+0

Я использовал план А во второй ссылке, которую вы отправили, и работает лучше, чем ожидалось .. Спасибо! –

+1

Я должен был подчеркнуть, что 'SET NAMES utf8' необходим, чтобы предотвратить вмешательство будущих« INSERT ». –

+0

Да, я уже это считал. Спасибо –

0

Может быть, это полезно [http://forums.mysql.com/read.php?103,209072,209072

* Та же ошибка и решение на форуме MySQL. (с 2008 года)

+0

Это решение для вставки данных или обновления с новыми данными, но я хочу только изменить текущую кодировку данных или способ ее отображения. –

+0

Извините за это, попробуйте использовать [проект] (http://www.ar-php.org/), bin [Arabic-3.6.0] (http://sourceforge.net/projects/ar-php/files/) ** По оригинальной [протекторам] (http://stackoverflow.com/questions/6175053/how-to-convert-arabic-characters-to-unicode-using-php) –

+0

Спасибо, это очень полезно, но не в мое дело . Я обновил свой вопрос о том, как отображаются символы. –

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