Статьи"Вопросики", "кракозяблики" или "как исправить ошибки хостера"Сейчас появляется все больше предложений хостинга с самыми последними версиями MySQL-серверов, хостеры обновляют у себя версии софта "до последнихимеющихся".
Часто это приносит проблемы пользователям - сайт упорно выдает вместо кириллицы или знаки вопросиков Для начала давайте рассмотрим отличия в структуре БД и таблиц разных версий MySQL-серверов. Я делю версии MySQL-серверов на:
Они имеют следующие отличия:
Все эти параметры (а мы сейчас рассматриваем только те, которые влияют на работу с кириллицей) существуют в системе MySQL-сервера в виде переменных, соответственно - глобальных (global) и локальных (session) и для перенастройки параметров MySQL-сервера достаточно их изменить следующими SQL-операторами: SET GLOBAL variable_name = new_valie SET SESSION variable_name = new_valie Для просмотра текущих значений нужной переменной используйте следующие операторы: select @@global.variable_name select @@session.variable_name Пример: set session collation_server = cp1251_general_ci; select @@session.collation_server; ... вот 1251 set session collation_server=latin1_swedish_ci; select @@session.collation_server; ... а здесь уже latin1 Посмотреть их можно и иным способом - через phpMyAdmin:
... вот они:
Можно посмотреть стразу все переменные сервера: SHOW VARIABLES Давайте рассмотрим эти переменные:
Теперь давайте рассмотрим случай "ненормального" MySQL-сервера, который установлен хостером с параметрами "по умолчанию и хай стоить...". Дело в том, что "по умолчанию MySQL-сервер устанавливается в кодировке latin1 , что нас ну никак не устраивает, поскольку именно эта настройка и является основным нашим врагом и "производителем" знаков вопросиков "?????? ???????? ??????????". Итак, мы имеем установленные MySQL-сервер с параметрами кодировки по умолчанию latin1. При подаче последовательности SQL-команд на создание новой БД и таблицы в ней: # создание БД CREATE DATABASE `TEST`; # создание таблицы с одним текстовым полем CREATE TABLE `TEST` ( `title` TEXT ) ENGINE = MYISAM; ... мы получим:
Для нормальной работы с кириллицей создание БД, таблицы и полей на сервере с latin1 должно выглядеть так: # создание БД CREATE DATABASE `TEST` COLLATE cp1251_general_ci; # создание таблицы с одним текстовым полем CREATE TABLE `TEST` ( `title` TEXT CHARACTER SET cp1251 COLLATE cp1251_general_ci ) ENGINE = MYISAM COLLATE cp1251_general_ci; ... только тогда мы получим:
Но, как правило у пользователя нет прав на создание БД собственным SQL-скриптом, БД создается или панелью управления хостинга, которая оставляет кодировку по умолчанию, что и приводит к дальнейшему распространению действия latin1 на вложенные объекты - таблицы и поля. Выход?
В последнем случае мы избавимся от головной боли с переписыванием SQL-скриптов, с неработоспособностью нужных компонентов и т.п. Для начала требуется составить список БД, таблиц и полей в таблицах. которые имеют кодировку, вызывающую потерю кириллицы, в нашем случае это любая кодировка, отличная от cp1251_general_ci , после чего потребуется составить SQL-скрипт и выполнить его на MySQL-сервере. Вот параметры этого скрипта:
Кодировку отдельных объектов можно сменить прямо в phpMyAdmin:
После смены кодировки полей, даже старые компоненты, которые были написаны еще до выхода этих версий MySQL, начинают работать нормально, только данные, которые уже находятся в БД "вопросиками", можно считать потерянными, их придется вводить заново уже после того, как БД, таблицы и поля таблиц будут переведены в кодировку 1251. Для хостеров: (и не говорите, что не читали...)Для перенастройках самого MySQД-сервера на кириллицу 1251 следует внести изменения в MY.CNF (желательно в каталоге /etc для *nix) или MY.INI: character-sets-dir=/путь_к_папке_с_чарсетами # если запросит... default-character-set=cp1251 [mysql] default-character-set=cp1251 [mysqld] default-character-set=cp1251 ... после чего перезагрузить MySQL-сервер. В результате должно получиться:
... особенно важно Глобальное значение, т.к. от него "пляшут" все по умолчанию. Как правило, этого вполне достаточно для перевода всей системы MySQL-сервера в 1251 кодировку, т.к. все остальные объекты MySQL-сервера будут воспринимать установку по умолчанию. БД установится в 1251 потому, что сервер в 1251, таблицы будут создаваться в 1251, потому что БД и 1251. Поля будут в 1251, потому что таблица в 1251 и т.п. Если установки этих параметров не хватит, вводите в конфиг-файл соответствующие переменные, пока после очередной перезагрузки не установятся нужные параметры. Общее правило таково:
Для установки глобальных параметров MySQL-сервера (равнозначные команды): mysql> SET GLOBAL collation_server=cp1251_general_ci; mysql> SET @@global.collation_server=cp1251_general_ci; Полный список переменных смотри: SHOW VARIABLES |
|||||||||||||||||||||||||||||||||||||||||||||