MySQL хранит в поле - PullRequest
       10

MySQL хранит в поле

0 голосов
/ 23 ноября 2010

Слушай, я сделал простое приложение, в котором пользователи загружают контент в базу данных MySQL, однако некоторые объекты не кодируются.Такие вещи появляются

ââ¬Å

вместо кавычек, а что нет.Я знаю, что они должны были закодировать эти значения в сущности HTML, когда они были вставлены в базу данных, однако теперь есть несколько тысяч строк, содержащих данные.

Есть ли у нас функция PHP для кодирования этих значений при возврате данных обратно в браузер?


Алекс Браун обновление.Поскольку здесь тоже может быть проблема с кодированием, вот что я вижу:

alt text

1 Ответ

5 голосов
/ 23 ноября 2010

Браузеры ваших пользователей отправляют данные в кодировке UTF-8, но вы подключаетесь к базе данных, которая 1) предполагает, что вы отправляете данные в кодировке latin1 2) хранит ваши данные в виде строк в кодировке latin1.Поэтому ваши данные хранятся в неправильном кодировке.

Когда вы извлекаете данные из базы данных, они будут предоставлены как строки latin1, но поскольку строки latin1 просто неправильно закодированы в UTF-8, а PHP наивно обрабатывает все строкикак двоичные строки, вы просто возвращаете исходную строку UTF-8.Когда вы выводите эту строку на страницу HTML, которая снова объявляется в кодировке UTF-8, строка отображается так, как она была отправлена ​​пользователем.

Однако, если вы просматриваете содержимое базы данных с помощью программного обеспечения, которое имеетглубокое понимание обработки наборов символов в MySQL, это программное обеспечение идентифицирует наборы символов столбца как latin1 и удостоверится, что отображаемые символы действительно являются символами строки latin1, которая, как мы отмечали, была неправильно закодирована в UTF-8.Поэтому вы видите неправильно закодированные данные.

Существует ряд шагов, которые вы должны предпринять, чтобы исправить это.Во-первых, вы ожидаете обработать данные в кодировке UTF-8 (как объявлено на уровне HTML), поэтому вы должны убедиться, что именно так вы общаетесь и с MySQL.Вы делаете это путем выдачи SET NAMES 'utf8' всякий раз, когда вы формируете соединение с базой данных.(Примечание: API вашей базы данных может предоставлять специальную функцию для изменения набора символов соединения. Я думаю, что API mysql нет, но я не уверен.)

Во-вторых, вы должны убедиться, чтоВы храните свои данные в кодировке UTF-8.Это означает, что наборы символов столбцов вашей базы данных должны быть utf8.Набор символов столбца можно изменить с помощью оператора ALTER TABLE ... MODIFY.Не забудьте также изменить набор символов таблицы по умолчанию (это устанавливает набор символов для новых столбцов, добавляемых в таблицу, для которых вы не указываете явно набор символов).И измените набор символов базы данных, пока вы на нем.

Однако, когда вы изменяете набор символов столбца, MySQL предполагает, что данные, уже сохраненные в строках этой таблицы, не являются неправильно закодированными, а сохраняются действительные данныев старом наборе символов.Поэтому он преобразует ваши неверно закодированные данные UTF-8 (которые он обрабатывает как данные с латинской кодировкой 1) в данные в кодировке UTF-8, так что в итоге вы получите данные с двойным кодированием UTF-8.Есть способ обойти это: сначала преобразуйте набор символов столбца в набор символов binary, затем из binary в utf8.Таким образом, MySQL не изменяет двоичную форму данных, поскольку вы преобразуете их в формат, в котором они обрабатываются как произвольные двоичные строки.

Удачи!

...