|
Очень часто приходится слышать жалобы типа:
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 |
На форуме