Черные бриллианты, которые поправляются в MySQL

0

У меня возникает очень странная проблема с сайтом, над которым я работаю. Сайт - это, в основном, доска объявлений, где владелец или пользователи могут создавать списки вакансий, включая описание, которое заканчивается тем, что оно хранится в текстовом поле MySQL. То, что мы переживаем, это, когда вводятся списки из определенных источников, они сначала заканчиваются "Черным Алмазом" с вопросительным знаком внутри персонажа вместо апострофов и двойных пространств. Эта часть, которую я знаю, является проблемой кодирования и может исправить. Реальный вопрос заключается в том, что эти черные бриллианты показывают, когда запись отображается в инструменте администратора MySQL и когда список вакансий просматривается в веб-браузере (простой оператор select отображает список в приложении PHP), но после первого рассматривается, то проблема как-то фиксируется. Это похоже на запуск выбора, а затем отображение записи обновляет поле описания задания и исправляет проблемы с кодировкой. Как это могло произойти? Кто-нибудь слышал об этом или что-то подобное? Я не могу понять, как изменилось поле базы данных без выполнения инструкции обновления...

Теги:

4 ответа

2

Как вводятся списки вакансий? Они введены через веб-страницу? Если да, то какое кодирование символов использует веб-страница? (Это должно определять кодировку символов представленных данных AFAIK.) Каким символьным набором является соединение, используемое для связи с MySQL? Каков набор символов столбца, в котором хранятся данные? Наконец, какова кодировка символов веб-страницы (ов), на которой просматриваются введенные данные?

Вот что я делаю: объявляю все мои страницы закодированными в кодировке UTF-8, используя следующий тег в начале раздела <head>:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Я немедленно выдаю следующую команду при подключении к MySQL, чтобы убедиться, что MySQL понимает, что данные, которые я отправляю на него, будут закодированы в кодировке UTF-8:

SET NAMES uft8

(В зависимости от используемого метода абстракции базы данных может быть рекомендована специальная функция для установки набора символов соединения, например mysqli mysqli_set_charset().)

Я также убеждаюсь, что те столбцы, в которых я собираюсь хранить данные UTF-8, объявляются UTF-8. Вы можете узнать, что представляет собой набор символов столбца, выпуская SHOW CREATE TABLE table_name. Набор символов таблицы (по умолчанию это набор символов для любого столбца в таблице) отображается в конце. Если набор символов для столбца отличается от набора символов по умолчанию для таблицы, он отображается как часть определения столбца. Если вы хотите изменить набор символов столбца, вы можете сделать это с помощью ALTER TABLE.

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

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

0

У меня была такая же проблема (кодировка mysql и кодировка веб-страницы, установленная в UTF-8, но черные алмазы, появившиеся в моих результатах запроса. Я нашел этот фрагмент во время поиска в Интернете, но не смог, чтобы жизнь меня находила его источник, чтобы дать правильную атрибуцию:

if( function_exists('mysql_set_charset') ){
  mysql_set_charset('utf8', $db_connection);
}else{
  mysql_query("SET NAMES 'utf8'", $db_connection);
}

Во всяком случае, он прояснил проблему для меня.

0

Эта страница, хотя предназначена для Wordpress, может помочь

http://codex.wordpress.org/Converting_Database_Character_Sets

0

Запуск этой проблемы несколько лет назад... Я помню, как находил этих печально известных персонажей и заменял их в php одной цитатой или двойной цитатой... Конечно, с экранированием... Простое preg_replace для этих символов будет сделать трюк... Его просто проблема с кодировкой...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню