Что может сломать наборы символов между базой данных и дисплеем?

Я использую базу данных MySQL для хранения некоторых строк, содержащих немецкие умлауты (äüö). Таблица «testtable» и столбец «текст» сопоставлены utf8_bin, и PHPMyAdmin сообщает мне, что «соединение MySQL» также является utf8_bin.

Затем я использую PHP-скрипт для чтения строк и их отображения:

$sql = "SELECT `text` FROM `testtable` WHERE `id`=$id";

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, false);
mysql_select_db(MYSQL_DATABASE,$db);

$result = mysql_query($sql,$db);
if (!$result or mysql_errno()) die("Something was wrong with the query: $sql");

$rows = array();
while(($rows[] = mysql_fetch_assoc($result)) || array_pop($rows));

foreach ($rows as $r) {echo $r['text']}

Сам файл закодирован в utf-8 по моему редактору, а страница объявлена ​​как utf-8 в шапке:

<meta charset="utf-8">

Тем не менее, текст «Это тестовое сообщение äüöß» в базе данных отображается как «Это тестовое сообщение ����». Когда я пишу умлауты непосредственно в HTML файла PHP или напрямую эхо-умлауты, они отображаются правильно, поэтому я полагаю, что ошибка кодирования должна быть где-то между базой данных и PHP-сервером.

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


person Armatus    schedule 22.05.2013    source источник
comment
рекомендуем прочитать это, если вы еще не ознакомились с kuntstube.net/frontback   -  person user428517    schedule 22.05.2013
comment
Ха-ха, я только что прочитал его статью о кодировании, которая была очень поучительной. Я прочитаю это в следующий раз :)   -  person Armatus    schedule 22.05.2013


Ответы (1)


PHPMyAdmin сообщает вам только о собственной кодировке соединения, а не о соединении между базой данных и вашим приложением. Попробуйте выполнить запрос

SET NAMES utf8

сразу после того, как вы установили соединение

person claustrofob    schedule 22.05.2013
comment
Вот оно. Спасибо! В качестве примечания для потенциальных будущих посетителей: указанный запрос должен был быть вставлен непосредственно после соединения, даже до mysql_select_db - person Armatus; 22.05.2013