Регистрация
 
 
 
 
 

На сайте


Donate

Благодарность Автору

Webmoney Yandex PayPal
Powered by Adeptus Donate


Главная arrow Работы
Вопросы кодировки БД и таблиц Joomla Печать E-mail
14.05.2008 г.

Очень часто приходится слышать жалобы типа: Joomla устанавливается и работает без вопросов, а любой вновь устанавливаемый компонент, модуль или другое расширение после установки упорно выдает вместо кириллицы в контенте или знаки вопросиков "???? ??????? ?????? ?????????????? ???????" или вообще что-то непотребное "Сейчас появляется РІСЃРµ больС?Рµ предложе".

 
Как в таком случае исправить ситуацию и запустить необходимый компонент?


Для начала, надо посмотреть системные переменные MySQL - через phpMyAdmin:

 
... вот они:
 

Давайте рассмотрим эти переменные:

Имя переменно Описание Зона десйтвия
character_set Кодировка по умолчанию. С версии 4.1.1 удалена. НЕ ИСПОЛЬЗОВАТЬ! GLOBAL | SESSION
character_set_client Кодировка для операторов, поступающих со стороны клиента GLOBAL | SESSION
character_set_connection Кодировка, используемая для литералов, не имеющих устройства для ввода символов, (у некотрых функций) и для преобразования числового кода в строковый. GLOBAL | SESSION
character_set_database Кодировка, используемая БД по умолчанию. Сервер устанавливает эту переменную каждый раз, когда изменяется БД по умолчанию. Если БД по умолчанию отсутствует, переменная будет иметь то же  значение, что и character_set_server. GLOBAL | SESSION
character_set_server Кодировка по умолчанию для всего сервера. GLOBAL | SESSION
character_set_results Кодировка, используемая для возвращению клиенту результатов запроса. GLOBAL | SESSION
character_set_system Кодировка, используемая сервером для хранения идентификаторов. Всегда имеет значение = UTF8 GLOBAL | SESSION
collation_connection Сопоставление кодировки соединения. GLOBAL | SESSION
collation_database Сопоставление кодировки БД. переменная устанавливается всякий раз, когда изменяется БД по умолчанию. Если БД по умолчанию отсутствует, переменная будет иметь тот же значение, что и collation_server GLOBAL | SESSION
collation_server Сопоставление по умолчанию GLOBAL | SESSION


Теперь давайте рассмотрим случай "ненормального" MySQL-сервера, который установлен хостером с параметрами "по умолчанию и хай стоить...". Дело в том, что "по умолчанию MySQL-сервер устанавливается в кодировке latin1 , что нас ну никак не устраивает, поскольку именно эта настройка и является основным нашим врагом и "производителем" знаков вопросиков "?????? ???????? ??????????".
 

Итак, мы имеем установленные MySQL-сервер с параметрами кодировки по умолчанию latin1.

При подаче последовательности SQL-команд на создание новой БД и таблицы в ней:

# создание БД
CREATE DATABASE
`TEST` ;  

# создание таблицы с одним текстовым полем
CREATE TABLE
`TEST` (
    `title` TEXT
) ENGINE = MYISAM ;


... мы получим: 

        - БД с кодировкой latin1
        -
Таблицу "TEST"  с кодировкой
latin1
           


 
       
        - Текстовое поле 'title' с кодировкой
latin1
 

           

 
Для нормальной работы с кириллицей создание БД, таблицы и полей на сервере с 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;


... только тогда мы получим:

       - БД с кодировкой 1251
        -
Таблицу "TEST"  с кодировкой 1251



        - Текстовое поле 'title' с кодировкой 1251


Но:

  • во первых, как правило у пользователя нет прав на создание БД собственным SQL-скриптом, БД создается или панелью управления хостинга, которая оставляет кодировку по умолчанию, что и приводит к дальнейшему распространению действия latin1 на вложенные объекты - таблицы и поля;
     
  • во вторых, в Joomla! при установке компонентов, как правило, в 99.9 % случаев, SQL-команды создания объектов и работы с ними, не содержат этик команд тоже

Выход?

  • первое: переписывать SQL-скрипты (на что не каждый пользователь способен, да и "на фиг надо");
  • второе: перевести все вложенные объекты БД в кодировку 1251

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

Для начала требуется составить список БД, таблиц и полей в таблицах. которые имеют кодировку, вызывающую потерю кириллицы, в нашем случае это любая кодировка, отличная от cp1251_general_ci , после чего потребуется составить SQL-скрипт и выполнить его на MySQL-сервере. Вот параметры этого скрипта:
 

 

Смена кодировки БД ALTER DATABASE `db_name` COLLATE cp1251_general_ci
Смена кодировки у таблицы ALTER TABLE `table_name` COLLATE cp1251_general_ci
Смена кодировки у поля ALTER TABLE `table_name`
CHANGE
`current_field_name` `new_field_name` VARCHAR( 100 ) CHARACTER SET cp1251
COLLATE cp1251_general_ci


Последнюю команду рассмотрим поподробнее:

Изменить в таблице... ALTER TABLE
... в какой таблице.. `test
...сменить... CHANGE
..меняем это поле... `test`
...новое его имя (то же) ... `test`
... новые параметры поля (те же) ... VARCHAR( 100 )
...новая кодировка поля... CHARACTER SET cp1251
... новое сопоставление. COLLATE cp1251_general_ci


Кодировку отдельных объектов можно сменить прямо в phpMyAdmin:

     

После смены кодировки полей, даже старые компоненты, которые были написаны еще до выхода этих версий MySQL, начинают работать нормально, только данные, которые уже находятся в БД "вопросиками", можно считать потерянными, их придется вводить заново уже после того, как БД, таблицы и поля таблиц будут переведены в кодировку 1251.

Для перенастройки  самого MySQL-сервера на кириллицу 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 и т.п.

Если установки этих параметров не хватит, вводите в конфиг-файл соответствующие переменные, пока после очередной перезагрузки не установятся нужные параметры. Общее правило таково:

  • переменная пишется с разделением слов знаком подчеркивания:  default_character_set
  • написание параметра в конфиг-файле вместо знака подчеркивания знак "тире": default-character-set
  • параметром командной строки при запуске сервера знаком подчеркивания:
      
    shell>  mysqld --variable1_name=Variable1Value
            --variable2_name=Variable2Value
            --variable3_name=Variable3Value
     
Для установки глобальных параметров MySQL-сервера (равнозначные команды):

mysql> SET GLOBAL collation_server=cp1251_general_ci;

mysql> SET @@global.collation_server=cp1251_general_ci;

Полный список переменных смотри:

        SHOW VARIABLES

Автор: AnDyr

Просмотров: 1429
 
Вы должны войти или зарегистрироваться для отправки комментария.
Обсуждение (0)
Нет комментариев.
« Пред.   След. »