11.09.06
Mysql and collation’s.
Один из наших клиентов наступил на грабли, 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’”) .
viliar said,
November 9, 2006 at 4:42 pm
в некоторых случаях возможно еще нужно будет добавить SET CHARACTER SET ‘utf8′.
al-x said,
December 18, 2006 at 10:43 am
меня всегда умиляют такие вот инструкции.
а для тупых юзерей: куда пихать эти строки? и куда, в некоторых случаях, нужно добавить сет чарактер сет?!
viliar said,
December 18, 2006 at 12:46 pm
Где-то должен быть скрипт подключения к бд. Сразу после инициализации соединения.
viliar said,
December 18, 2006 at 1:59 pm
Не забудь все-таки проверить, что у тебя таблицы в utf8.
al-x said,
December 18, 2006 at 2:31 pm
ну блин, я так думаю, что если шэ не показывает нормально, то видимо утф
viliar said,
December 18, 2006 at 3:31 pm
show full columns from … table_name; ?
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, с результатом на выходе - хрен знает в чём.