Описание проблемы
После обновления PHP на нашем сервере разработки с 5.2 до 5.3 мы столкнулись с проблемой, когда данные, запрашиваемые из нашей базы данных и отображаемые на веб-странице, отображаются с неправильной кодировкой при попытке отобразить русский язык.символов.
Среда
- Dev OS: Debian GNU / Linux 6.0
- Dev PHP: 5.3.5-0.dotdeb.1
- Live MySQL: Distrib 5.1.49
Подробности
В PHP 5.3 стандартная клиентская библиотека для взаимодействия с базами данных MySQL была изменена с libmysql на mysqlnd , чтопохоже, причина проблемы, с которой мы сталкиваемся.
Мы подключаемся к базе данных с помощью следующего кода:
$conn = mysql_pconnect('database.hostname', 'database_user', 'database_password');
$mysql_select_db('database', $conn);
Данные, хранящиеся в нашей базе данных, кодируются с помощью UTF-8.кодирование.Подключение к базе данных через клиент командной строки и выполнение запросов подтверждает, что данные не повреждены и правильно закодированы.Однако, когда мы запрашиваем базу данных на PHP и пытаемся отобразить те же самые данные, она искажается.В данном конкретном случае мы пытаемся отобразить русские символы, и в результате получаются не английские, не русские символы:
Получаемые нами заголовки ответа подтверждают, что тип содержимого - UTF-8.:
Мы протестировали строки перед отображением с mb_detect_encoding в строгом режиме, а также mb_check_encoding и получили сообщение, что строка былаСтрока UTF-8 перед отображением.Мы также использовали mysql_client_encoding для проверки клиентской кодировки, и это также указывает, что набор символов - UTF-8.
В ходе исследования мы обнаружили некоторые предложения , чтобы попытатьсяОбойти эту проблему:
header("Content-type: text/html; charset=utf-8");
mysql_set_charset('utf8');
mysql_query("SET SESSION character_set_results = 'UTF8'");
mysql_query('SET NAMES UTF8', $conn);
Мы даже попробовали utf8_encode :
utf8_encode($string);
Однако ни одно из этих решений не сработало.
Выполняетсяопций мы обновили MySQL в нашей системе разработки до Distrib 5.1.55.После этого обновления все отображалось правильно, когда мы подключались к нашей базе данных разработки.Конечно, он продолжает отображаться неправильно, когда мы подключаемся к нашей действующей базе данных.
В идеале, мы хотели бы решить эту проблему, не обновляя MySQL на наших производственных серверах, если мы не сможем установить точную причину, почему это не так.работает и почему обновление это исправит. Как мы можем решить эту проблему кодирования без обновления MySQL?В качестве альтернативы, почему обновление MySQL устраняет проблему?