Возвращаясь к вопросу кодировки

Рубрика: WordPress -> Статьи
Вторник, 2 октября 2007 г.
Просмотров: 2397
Подписаться на комментарии по RSS
]]>
]]>

В WordPress 2.2 появился дополнительный параметр конфигурации DB_CHARSET, который позволяет выполнить запрос «SET NAMES 'utf8'». Это отличное решение, поскольку раньше для этого необходимо было вручную править файл wp-bd.php и дописывать нужные строчки.

Наряду с DB_CHARSET появился и параметр DB_COLLATE, который теоретически должен влиять на параметр COLLATION_SERVER, т.н. кодировку сравнения. Если кратко, то MySQL позволяет хранить каждую таблицу, каждое поле в любых кодировках. То есть даже если база данных установлена в utf-8, то можно спокойно создать таблицу в cp-1251, а в ней поле в latin7. Параметр DB_COLLATE как раз и служит для такого управления.

Проблема в том, что разработчики WordPress так и не решили вопрос использования DB_COLLATE и по сути он сейчас вообще не используется. Точнее он задействуется только в процессе инсталяции при создании таблиц.

Поскольку для наших серверов типичным является кодировка cp-1251, то в своей сборке WordPress я добавил код, который реализует возможности DB_COLLATE. Однако существует один момент, который необходимо учитывать. Дело в том, что при создании таблиц необходимо явно указывать кодировку. То есть никакие предварительные SQL-запросы просто не работают.

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

Выход только один: нужно явно указывать кодировку при создании таблиц.

Вот пример SQL-запроса, где кодировка указана:

  1.  $createT = "CREATE TABLE db_table (
  2.   id bigint(20) NOT NULL auto_increment,
  3.   name varchar(255) NOT NULL default '',
  4.   code text,
  5.   PRIMARY KEY (id)) COLLATE utf8_general_ci";

Данный запрос создаст таблицу с кодировкой сравнения utf8_general_ci.

Что же делать в случае, если плагин не указывает кодировку? Тут есть несколько решений.

Первое и самое очевидное, это вручную прописать utf8_general_ci в коде плагина. Правда этот способ годится только для тех случаев, когда вы это делаете для себя.

Второй способ - сразу после создания таблицы (обычно после активации плагина) перейти в phpMyAdmin и вручную сменить кодировку.

Третий способ - написать функцию, которая будет учитывать кодировку, указанную в конфигурации WordPress. В своей сборке WordPress 2.3 я добавил такую функцию:

  1.  function maxsite_collate() {
  2.   if ( defined('DB_COLLATE') ) {
  3.   if ( version_compare(mysql_get_server_info(), '4.1.0', '>=')
  4.   && (DB_COLLATE != '' ) )
  5.   $out = ' COLLATE ' . DB_COLLATE;
  6.   else $out = '';
  7.   }
  8.   else $out = '';
  9.   return $out;
  10.  }

Эта функция возвращает строчку « COLLATE utf8_general_ci» в случае, если версия MySQL старше 4.1 и константа DB_COLLATE определена.

Пример использования функции (пример из плагина Ушки) :

  1.   if ( function_exists('maxsite_collate') )
  2.   $collate = maxsite_collate();
  3.   else $collate = '';
  4.   $query = "SHOW TABLES LIKE '" . $ushki_db_table . "'";
  5.   if(!$result = $wpdb->get_var($query)) {
  6.   $createT = "CREATE TABLE $ushki_db_table (
  7.   ushki_id bigint(20) NOT NULL auto_increment,
  8.   ushki_name varchar(255) NOT NULL default '',
  9.   ushki_code text,
  10.   PRIMARY KEY (ushki_id)) {$collate}";
  11.   $wpdb->query($createT);
  12.   }

То есть вначале мы получаем строчку COLLATE в $collate, а после этого дописываем переменную в SQL-запрос.

Собственно функция maxsite_collate сделана только ради совместимости со старыми версиями WordPress, потому что в них не предусмотрена константа DB_COLLATE. Для новых версий (> 2.2) можно сразу написать:

  1.   $collate = DB_COLLATE;
  2.   $query = "SHOW TABLES LIKE '" . $ushki_db_table . "'";
  3.   if(!$result = $wpdb->get_var($query)) {
  4.   $createT = "CREATE TABLE $ushki_db_table (
  5.   ushki_id bigint(20) NOT NULL auto_increment,
  6.   ushki_name varchar(255) NOT NULL default '',
  7.   ushki_code text,
  8.   PRIMARY KEY (ushki_id)) {$collate}";
  9.   $wpdb->query($createT);
  10.   }
]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>
РЕКЛАМАПредлагаем запчасти бмв в Кейсил Минус 8 лет на Вашем лице - обучение по косметологии.

Комментариев: 2

Вы можете получать новые комментарии к этой записи по RSS или оформить подписку на все комментарии сайта. Или даже на все новые записи сайта. Не знаете, как это сделать?
  1. 2007-10-22 в 04:08:08 | vadkuz

    Круто, я надеюсь когдато все будет унифицированно ...

  2. 2008-01-11 в 19:33:03 | Дмитрий

    Как сделать парсер, чтобы импортировать хтмл-код с кодировкой 1251. Тек вордпресс кодировка: ютф-8

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)