У меня есть база данных MySQL, я установил collation = utf8_unicode_ci.
Я пытаюсь получить значение через PHP, но получаю "???" вместо фактической строки.
Наборы символов - это как символы кодируются .
Сортировки - это как символы сортируются .
Это разные вещи. Скорее всего, ваши таблицы или столбцы имеют правильное сопоставление, но неправильный набор символов. В разделе Интернационализация руководства MySQL содержится много информации о том, как правильно все настроить.
Может кто-нибудь опубликовать фрагмент кода, который фактически извлекает значение из БД и выводит строку на экран?
Давайте продемонстрируем, как использовать utf8 в качестве набора символов, и сопоставление utf8 «без учета регистра». Я использую PDO в этом примере, но та же общая идея должна работать и с mysqli
. Я бы не советовал использовать старое расширение mysql
.
// Let's tell MySQL we're going to be working with utf8 data.
// http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html
$db->query("SET NAMES 'utf8'");
// Create a table with our proper charset and collation.
// If we needed to, we could specify the charset and collation with
// each column.
// http://dev.mysql.com/doc/refman/5.1/en/charset-column.html
// We could also set the defaults at the database level.
// http://dev.mysql.com/doc/refman/5.1/en/charset-database.html
$db->query('
CREATE TABLE foo(
bar TEXT
)
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci
ENGINE=InnoDB
');
// I don't know Arabic, so I'll type this in English. It should
// work fine in Arabic, as long as the string is encoded as utf8.
$sth = $db->prepare("INSERT INTO foo(bar) VALUES(?)");
$sth->execute(array("Hello, world!"));
$sth = $db->query("SELECT bar FROM foo LIMIT 1");
$row = $sth->fetch(PDO::FETCH_NUM);
echo $row[0]; // Will echo "Hello, world!", or whatever you inserted.
@ Комментарий Томпа ниже верен. Убедитесь, что вы используете правильный набор символов с заголовком вашего типа контента. Например:
header('Content-type: text/html; charset=utf-8'); // Note the dash!