11.09.06

Mysql and collation’s.

Posted in web at 1:33 pm by viliar

Один из наших клиентов наступил на грабли, c которыми я, как не вебмастер - раньше не сталкивался и даже не слышал. К счастью, другие сталкивались, и http://www.google.com об этом в курсе.

При использовании базы данных в utf8 (таблицы имели требуемый collation) у него импортируемые данные (ака текст) отобрались  на страницах не совсем корректно. А именно буквы ‘ш’ и ‘И’ кракозябрами. Остальные нормально. Сначала вину валили на iconv, который их предварительно из cp1251 в utf-8 перекодирует, но, оказалось, что это бага самого mysql. Или фича. Как изволите.

При использовании default character cp1251, таким образом, что

mysql> show variables like ‘char%’;
+————————–+—————————————–+
| Variable_name | Value |
+————————–+—————————————–+
| character_set_client | cp1251 |
| character_set_connection | cp1251 |
| character_set_database | cp1251 |
| character_set_results | cp1251 |
| character_set_server | cp1251 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql4/share/mysql/charsets/ |
+————————–+—————————————–+

недостаточно, чтобы сама база была создана utf8. Будет возникать как раз вышеописанная проблема.
Вопрос решает следущая строчка:

mysql_query(”SET NAMES ‘utf8′ COLLATE ‘utf8_general_ci’”) .

7 Comments

  1. viliar said,

    November 9, 2006 at 4:42 pm

    в некоторых случаях возможно еще нужно будет добавить SET CHARACTER SET ‘utf8′.

  2. al-x said,

    December 18, 2006 at 10:43 am

    меня всегда умиляют такие вот инструкции.
    а для тупых юзерей: куда пихать эти строки? и куда, в некоторых случаях, нужно добавить сет чарактер сет?!

  3. viliar said,

    December 18, 2006 at 12:46 pm

    Где-то должен быть скрипт подключения к бд. Сразу после инициализации соединения.

  4. viliar said,

    December 18, 2006 at 1:59 pm

    Не забудь все-таки проверить, что у тебя таблицы в utf8.

  5. al-x said,

    December 18, 2006 at 2:31 pm

    ну блин, я так думаю, что если шэ не показывает нормально, то видимо утф

  6. viliar said,

    December 18, 2006 at 3:31 pm

    show full columns from … table_name; ?

  7. al-x said,

    December 20, 2006 at 1:56 am

    для закрепления, на память пара строк:
    [code]
    $this->query(’SET CHARACTER SET utf8′);
    $this->query(’SET NAMES utf8′);
    [/code]
    в случае wordpress’а:
    файл wp-includes/wp-db.php, в районе 43-й строки, сразу под:
    [code]
    $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
    [/code]
    в моём случае сработали каждая из строк по отдельности.

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

14 queries. 0.252 seconds