on-line support service on-line support service

Проблема с кодировкой при выводе данных из БД. Что делать?


В базе данных MySQL с версии 4.1.х и новых версиях phpMyAdmin (с 2.6.0) внедрена расширенная поддержка юникод кодировок (UTF-8) и расширенные возможности для установки кодировок (к примеру теперь можно установить кодировку на каждую таблицу в отдельности). К сожалению на национальных (в том числе кириллических) кодировках некоторые из нововведений с расширенными возможностями кодировок могут вызвать некоторые проблемы. Данные внутри сервера БД теперь хранятся в кодировке utf-8, что позволяет пользователю оперировать данными в его БД так, как ему необходимо. Принципиально это большой плюс, но однако многие веб-разработчики уже столкнулись с проблемой смешения кодировок, когда на сайтах вместо русских букв выводятся (???) либо текст выводится не в той кодировке, которой нужно. И дело тут не в сервере БД, а в адаптированности к этому самих скриптов, многие из которых пока не умеют корректно работать с теми расширенными возможностями, предоставляемыми новыми версиями БД MySQL.


Исправить положение для кириллицы может прописывание в файле коннекта скрипта к базе данных ДО всех запросов SQL-команды SET NAMES 'cp1251' (тем самым данные при запросе или при записи будут преобразованы в эту кодировку). Ниже мы приводим более избыточный алгоритм для решения подобных проблем (при наличии у вас копии БД) на примере для кодировки win-1251:


1) Убедитесь, что дамп для восстановления или создания базы сделан в одной, нужной кодировке, например, win cp-1251. Проверьте чтобы в дампе НЕ БЫЛО значений в разных кодировках.


2) Сотрите всю базу данных (drop) на сервере


3) На стартовой странице phpMyAdmin выберите кодировку сравнения cp-1251 (сp-1251_general_ci), язык интерфейса English.


4) Создайте базу либо закачайте структурный дамп БЕЗ данных и установите для таблиц кодировку сравнения сp-1251_general_ci.


5) Теперь залейте дамп с данными, НЕ забыв указать кодировку дампа (в phpMyAdmin в выпадающем списке кодировок возле окна с именем загружаемового дамп-файла)

6) После заливки данных проверьте кодировку сравне


В коннекте к базе пропишите следующую SQL-команду:


SET NAMES 'cp1251'


Пример:


$conn = mysql_connect($this->host, $this->user, $this->password);


mysql_select_db($this->dbname, $db);


mysql_query("SET NAMES 'cp1251'");


$result = mysql_query($sql);


return $result;


mysql_close($conn);


При выгрузке данных из MySQL 4.1.x через phpmyadmin кириллические символы отображаются в виде (ГЂГäðååâГГ) - это не является проблемой, так как выгруженные данные находятся в кодировке utf-8 (в этой кодировке они хранятся в базе). Преобразовать такой дамп например в win-1251 достаточно просто - для этого можно использовать любой текстовый редактор, обеспечивающем корректную работу с кодировкой utf-8 (например GridinSoft Notepad или UltraEdit). Да, это несколько усложняет работу с данными в национальных кодировках, однако к этому придётся привыкнуть и переписать свои скрипты так, что была совместимость с новыми версиями БД MySQL, так как дальнейшее развитие БД MySQL будет идти именно по такому пути, и возврата назад нет.


on-line support service on-line support service
Copyright © 2006 - 2017 Powered by ASTEHOST