Я изучаю PHP-программирование, поэтому у меня есть настройка базы данных тестирования и попытка сделать с ней разные вещи. Таким образом, ситуация такова:
Сопоставление базы данных – utf8_general_ci.
Существует таблица «книги», созданная по запросу
create table books ( isbn char(13) not null primary key, author char(50), title char(100), price float(4,2) );
Затем он заполняется некоторыми примерами данных – обратите внимание, что текстовые записи на русском языке. Этот запрос сохраняется как utf-8 без спецификации .sql и выполняется.
insert into books values ("5-8459-0046-8", "Майкл Морган", "Java 2. Руководство разработчика", 34.99), ("5-8459-1082-X", "Кристофер Негус", "Linux. Библия пользователя", 24.99), ("5-8459-1134-6", "Марина Смолина", "CorelDRAW X3. Самоучитель", 24.99), ("5-8459-0426-9", "Родерик Смит", "Сетевые средства Linux", 49.99);
Когда я просматриваю содержимое созданной таблицы через phpMyAdmin, я получаю правильные результаты.
Когда я извлекаю данные из этой таблицы и пытаюсь отобразить ее через php, я получаю вопросительные знаки вместо русских символов. Вот фрагмент моего php-кода:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Books</title> </head> <body> <?php header("Content-type: text/html; charset=utf-8"); mysqli_set_charset('utf8'); @ $db = new mysqli('localhost', 'login', 'password', 'database'); $query = "select * from books where ".$searchtype." like '%".$searchterm."%'"; $result = $db->query($query); $num_results = $result->num_rows; for ($i = 0; $i < $num_results; $i++) { $row = $result->fetch_assoc(); echo "<p><strong>".($i+1).". Title: "; echo htmlspecialchars (stripslashes($row['title'])); echo "</strong><br />Author: "; echo stripslashes($row['author']); echo "<br />ISBN: "; echo stripslashes($row['isbn']); echo "<br />Price: "; echo stripslashes($row['price']); echo "</p>"; } ...
И вот вывод:
1. Название: Java 2. ??????????? ???????????? Автор: ????? ?????? ISBN: 5-8459-0046-8 Цена: 34.99
Может кто-то указать, что я делаю неправильно?
Может кто-то указать, что я делаю неправильно?
Да, я могу.
Вы не сказали серверу Mysql, какую кодировку данных вы хотите.
Mysql может предоставить любую кодировку в случае, если кодировка вашей страницы отличается от кодировки хранимых данных. И перекодируйте его на лету.
Таким образом, необходимо указать предпочтительную кодировку клиента (ваш PHP-код является клиентом базы данных).
По умолчанию это latin1
. Таким образом, поскольку в таблице символов latin1 нет таких символов, вместо них возвращаются вопросительные знаки.
Есть два способа сказать mysql, какую кодировку мы хотим:
SET NAMES
. Но до тех пор, пока вы правильно используете расширение mysqli, это не имеет большого значения. (хотя вы этого не делаете)
Обратите внимание, что в mysql эта кодировка называется utf8
, без тире или пробелов.
Попробуйте установить выходную кодировку:
SET NAMES 'utf-8' SET CHARACTER SET utf-8
Создать файл .htaccess
:
AddDefaultCharset utf-8 AddCharset utf-8 * CharsetSourceEnc utf-8 CharsetDefault utf-8
Сохраните файлы в UTF-8 без спецификации.
После вашего mysql_connect установите соединение с UTF-8:
mysql_query("SET NAMES utf8");
Следуйте советам Александра для кодирования .htaccess, заголовка и файлов
Вероятно, вам нужно вызвать mysqli_set_charset('utf8');
после того, как вы настроите свое соединение с new mysqli(...)
поскольку оно работает на ссылке, а не на глобальной настройке.
так..
@ $db = new mysqli('localhost', 'login', 'password', 'database'); mysqli_set_charset($db, 'utf8'); $query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
Кстати, этот запрос, по-видимому, открыт для SQL-инъекции, если только $searchterm
не дезинфицирован. Просто что-то, что нужно иметь в виду, подумайте о том, чтобы использовать подготовленные заявления.
И использование @ для подавления ошибок обычно не рекомендуется, особенно в процессе разработки. Лучше иметь дело с условиями ошибки.
после добавления mysql_query
@mysql_query("SET character_set_server='utf8'; "); @mysql_query("SET character_set_client='utf8'; "); @mysql_query("SET character_set_results='utf8'; "); @mysql_query("SET character_set_connection='utf8'; "); @mysql_query("SET character_set_database='utf8'; "); @mysql_query("SET collation_connection='utf8_general_ci'; "); @mysql_query("SET collation_database='utf8_general_ci'; "); @mysql_query("SET collation_server='utf8_general_ci'; ");
Попробуйте поместить также в документ HTML. Запустите метатег:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
это отличается от заголовка header("Content-type: text/html; charset=utf-8");
HTTP header("Content-type: text/html; charset=utf-8");