Помогите разобраться с кодировкой в MySQL и PHP
Здравствуйте уважаемые профессионалы.
Я только начал изучать PHP и MySQL и столкнулся с такой проблемой.
Сделал пару таблиц в БД, кодировка таблиц и текстовых полей везде стоит utf8_general_ci. Но при запросе к БД и выводе на экран вместо кириллицы выводятся знаки вопроса. Проверка кодировки на странице говорит, что кодировка latin 1 ???. Почему так, ведь везде в настройках сервера (у меня стоит Dewnwer), таблиц и текстовых полей в таблицах стоит utf8_general_ci ?
При вот таком запросе к таблице в БД -
$connection = mysqli_connect('127.0.0.1', 'root', '', 'mytest2');
printf("Изначальная кодировка: %s\n", mysqli_character_set_name($connection));
echo '<br>';
$result = mysqli_query( $connection, "SELECT * FROM `articles`" );
while ( ($record = mysqli_fetch_assoc($result)) )
{
print_r ($record);
echo '<hr>';
}
mysqli_close($connection);
на выходе получаю вот это -
В консоли phpMyAdmin, в самой таблице, всё выглядит корректно -
Прилагаю скрины с настройками таблиц и настройками сервера -
Посмотрел в значениях переменных сервера - вроде всё тоже в UTF-8, кроме одной переменной :
Может таки здесь собака зарыта ?
Пересмотрел похожие темы здесь, но не совсем понимаю - как c этим бороться! Может кто поможет дельным советом? Буду весьма благодарен!
Ответы (2 шт):
В Denwer не стоит использовать root пользователя, лучше создать нового пользователя. Цитата из документации с сайта Denwer:
3.10. После установки пакета с PHP 5 на всех моих форумах(phpBB и vBulleting) вместо русских букв-стоят знаки вопроса, смена кодировки не помогает. Моя версия SQL: 5.0.18 Что делать?
Используйте для форума отдельную базу данных и /отдельного пользователя БД, отличного от root/! Проблема возникает только в случае, если соединяться с базой под пользователем root (это известная особенность MySQL). Создать базу и пользователя можно, например, при помощи скрипта http://localhost/Tools/addmuser/
4.1. Проблема с кодировкой MySQL 4.1: из БД извлекаются «вопросики» вместо русских букв
MySQL 4.1 на внутреннем уровне работает с кодировкой UTF8 и перекодирует результат в требуемую форму (в нашем случае windows-1251) непосредственно перед передачей его клиенту (т.е. скрипту). В некоторых случаях оказывается, что кодировка клиента (скрипта) «не доходит» до MySQL. Соответственно, сервер передает «вопросики». Можно применить одно из следующих решений.
- Вписать в скрипт что-то вроде: mysql_query(«SET NAMES cp1251»). Это надо делать сразу же после подключения к MySQL. Проблема исчезнет.
- Вписать init-connect="SET NAMES cp1251" в /usr/local/mysql4/my.cnf (кто не видит этого файла, пусть изучает Windows, читает FAQ и думает головой) и перезапустить MySQL. Однако это сработает только для соединений, которые проходят НЕ под root-пользователем. Скрипты, коннектящиеся к базе под root, по-прежнему будут получать неверную кодировку. Лучше всего будет все-таки завести новую базу и пользователя через http://localhost/denwer/Tools/addmuser/ и забыть о проблеме.
- Чтобы диагностировать проблему, выполните в скрипте запрос SHOW VARIABLES LIKE 'char%'. Как видите, кодировка неверная: character_set_client=latin1. Это из-за того, что я подключился к базе под root. Если теперь подключусь под не-root пользователем – все будет нормально.
Создал нового пользователя "admin" и под него новую базу данных. Таблицы всё те же.
В общем, код получился такой -
$connection = mysqli_connect('127.0.0.1', 'admin', '123', 'admin');
mysql_query("SET NAMES cp1251");
$result = mysqli_query( $connection, "SELECT * FROM `comments`" );
while ( ($record = mysqli_fetch_assoc($result)) )
{
print_r ($record);
echo '<hr>';
}
mysqli_close($connection);
Но проблема всё так же и осталась!
Что я не так делаю?







