MaxSite CMS - бесплатный «движок» вашего сайта! Легкая, мощная и надежная CMS - система управления сайтом. Никаких тормозов!

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

2 октября 2007 г. Просмотров: 6657 RSS 2
WordPress » Статьи о WordPress

В 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-запроса, где кодировка указана:

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

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

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

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

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

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

function maxsite_collate() {
    if ( defined('DB_COLLATE') ) {
        if ( version_compare(mysql_get_server_info(), '4.1.0', '>=')
            && (DB_COLLATE != '' ) )
            $out = ' COLLATE ' . DB_COLLATE;
        else $out = '';
    }
    else $out = '';
    return $out;
}

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

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

<strong>    if ( function_exists('maxsite_collate') )</strong>
<strong>            $collate = maxsite_collate();</strong>
<strong>        else $collate = '';</strong>
    $query = "SHOW TABLES LIKE '" . $ushki_db_table . "'";
    if(!$result = $wpdb->get_var($query)) {
        $createT = "CREATE TABLE $ushki_db_table (
        ushki_id bigint(20) NOT NULL auto_increment,
        ushki_name varchar(255) NOT NULL default '',
        ushki_code text,
        PRIMARY KEY (ushki_id)) <strong>{$collate}</strong>";
        $wpdb->query($createT);
    }

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

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

<strong>    $collate = DB_COLLATE;</strong>
    $query = "SHOW TABLES LIKE '" . $ushki_db_table . "'";
    if(!$result = $wpdb->get_var($query)) {
        $createT = "CREATE TABLE $ushki_db_table (
        ushki_id bigint(20) NOT NULL auto_increment,
        ushki_name varchar(255) NOT NULL default '',
        ushki_code text,
        PRIMARY KEY (ushki_id)) <strong>{$collate}</strong>";
        $wpdb->query($createT);
    }

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru friendfeed.com google.com yandex.ru
Комментариев: 2
  1. Круто, я надеюсь когдато все будет унифицированно ...

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

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

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

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

Используйте нормальные имена

Имя и сайт используются только при регистрации

Зарегистрируйтесь, чтобы получать уведомления о новых комментариях по email.

Авторизация Войти через loginza

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

РЕКЛАМА Минус 8 лет на Вашем лице - обучение по косметологии.