Данные MySQL UTF8 не отображаются должным образом

Я хочу, чтобы все данные в MySQL были закодированы в UTF8. Я установил все наборы символов и параметры сортировки в UTF8 для базы данных, таблиц и столбцов. Прежде чем что-либо будет записано в базу данных, я использую mb_detect_encoding в PHP, чтобы проверить, является ли это UTF8. Таким образом, я считаю, что все данные закодированы в UTF8.

Однако вот проблема: возьмите это слово Ríkarðsdóttir, оно правильно отображается при запросе из базы данных и отображается через PHP на веб-странице в кодировке UTF8. Если я запрошу эту же запись через phpMyAdmin, я получу RÃkarðsdóttir. То же самое верно, если я использую командную строку MySQL.

Running SHOW VARIABLES returns to me:
character_set_client    utf8,
character_set_connection    utf8,
character_set_database  utf8,
character_set_filesystem    binary,
character_set_results   utf8,
character_set_server    latin1,
character_set_system    utf8

Только сервер latin1, и я нахожусь на виртуальном хостинге и не верю, что смогу это изменить. Может ли это быть проблема?

Вот чего я не понимаю: почему моя веб-страница UTF8 правильно отображает Ríkarðsdóttir, а веб-страница phpMyAdmin с кодировкой UTF8 отображает ее как RÃkarðsdóttir? Действительно ли данные не закодированы в кодировке UTF8 или база данных не считает, что это так? Что нужно сделать, чтобы исправить это?


person jkharlan    schedule 22.08.2011    source источник


Ответы (1)


Попробуйте запустить этот запрос сразу после подключения:

SET NAMES UTF8

Ваша база данных должна хранить данные как UTF8, и заголовок вашей веб-страницы также должен иметь объявление UTF8, но ваше соединение с базой данных также должно использовать UTF8. Вы можете запустить это в командной строке и/или через PHPMyAdmin. Все сообщения после этого «запроса» будут закодированы в UTF8.

person Brent Baisley    schedule 22.08.2011
comment
Спасибо за предложение; однако это не решило проблему. Я попробовал запрос SET NAMES 'utf8' через оболочку mysql и добавил его в phpMyAdmin, но в любом случае это не повлияло на отображение данных. Согласно документации mysql: dev.mysql.com/doc/refman /5.0/en/charset-connection.html, оператор SET NAMES 'x' эквивалентен этим трем операторам: SET character_set_client = x; УСТАНОВИТЬ character_set_results = x; SET character_set_connection = x Для запроса SHOW VARIABLES все они установлены в UTF8. Каким-то образом mysql хранит данные UTF8 в какой-то другой кодировке, предположительно latin1. - person jkharlan; 22.08.2011
comment
Вы можете попробовать запустить ALTER TABLE имя_таблицы CONVERT TO CHARACTER SET utf8, чтобы убедиться, что данные хранятся в UTF8. - person Brent Baisley; 22.08.2011