Оператор SELECT и крякозябры

rafaello

Новичок
Здравствуйте!
Есть таблица в базе данных, вот скрин с вебмина
http://joxi.ru/p278qK8F0RxKgA
Вот переменные Mysql

PHP:
character_set_client            utf8
character_set_connection    utf8
character_set_database       utf8
character_set_filesystem     binary
character_set_results         utf8
character_set_server          utf8
character_set_system        utf8
collation_connection          utf8_general_ci
collation_database            utf8_general_ci
collation_server                 utf8_general_ci
На этом же сервере я прописываю в PHP-файле:
PHP:
$query = "SELECT data FROM `poskr_subscribers_data` WHERE fieldid=2";
$result = mysql_query($query);
while($myrow = mysql_fetch_assoc($result)){
echo $myrow['data'];
}
и получаю в ответ сплошные знаки вопроса (кроме имен на латинице).
Пробовал менять кавычки, все одно, выдает знаки вопроса
PHP:
'SELECT data FROM `poskr_subscribers_data` WHERE fieldid=2';
Причем, если вводить этот запрос в самом вебмине
http://joxi.ru/EA4N8WNSDzxPam
то результат он выдает как положено
http://joxi.ru/vAWD7bDFknVjwr
 

artoodetoo

великий и ужасный
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
что нам говорит mysql_client_encoding() ?
 

artoodetoo

великий и ужасный
Который выбирает кодировку и на клиенте, и на сервере, а не только на сервере, как запрос set names.
(фейспалм)
именно SET NAMES устанавливает кодировку клиента. он решает проблему с "кракозябрами".
"кодировка клиента" устанавливается на сервере, как бы необычно это ни звучало, мы только извещаем сервер с чем будем работать. перекодированием занимается серверная сторона.

пэхапэшный *set_charset() вызывает SET NAMES + запоминает значение кодировки, чтобы помочь пэхапэшному *real_escape_string(). есть некий гипотетический для нас случай, когда *real_escape_string() может облажаться с экранированием некоторых китайских мультибайтных символов. для utf8 неактуально: пруф. поэтому да, он официально рекомендован.

[offtopic]я пытался повторить примеры из интернетов с демонстрацией уязвимости real escape string на мультибайтных символах, но безуспешно[/offtopic]
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
set names не устанавливает кодировку клиента, как ты себе это представляешь, думаешь, в libmysqlclient там где-то написано preg_match(/^set names/, query)? Не, в мыскле, конечно, местами говнокод, но не настолько же.

В случае с utf8, конечно, ничего страшного не случится, но неаккуратненько.
 

artoodetoo

великий и ужасный
@fixxxer, ты сейчас с кому обращался, кто писал про клиентские библиотеки?

П.С. кстати я сам использовал mysqli_set_charset, где надо. Про set names рассказал топикстартеру чтобы понимал как это работает, а не просто заклинание писал. Если кто-то ещё был не в курсе, может просветиться сейчас.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
именно SET NAMES устанавливает кодировку клиента
SET NAMES устанавливает сразу несколько кодировок (три, чтобы быть точным - клиент, коннект, результат) и одновременно выставляет сравнение в используемое по умолчанию.
mysqli_set_charset ипользует другую команду - "SET CHARACTER SET <charset>;", выставляющую только кодировку, не трогая collation(точнее, выставляет его равным сравнению, использумому в БД).
 
Сверху