Проблемы с вставкой строки utf-8 в базу данных, а затем вывод ее на веб-страницу

Я изучаю 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 

Может кто-то указать, что я делаю неправильно?

Related of "Проблемы с вставкой строки utf-8 в базу данных, а затем вывод ее на веб-страницу"

Может кто-то указать, что я делаю неправильно?

Да, я могу.
Вы не сказали серверу Mysql, какую кодировку данных вы хотите.
Mysql может предоставить любую кодировку в случае, если кодировка вашей страницы отличается от кодировки хранимых данных. И перекодируйте его на лету.
Таким образом, необходимо указать предпочтительную кодировку клиента (ваш PHP-код является клиентом базы данных).
По умолчанию это latin1 . Таким образом, поскольку в таблице символов latin1 нет таких символов, вместо них возвращаются вопросительные знаки.

Есть два способа сказать mysql, какую кодировку мы хотим:

  • несколько более предпочтительной является функция mysqli_set_charset () (метод в вашем случае).
  • менее предпочтительным является запрос SET NAMES .

Но до тех пор, пока вы правильно используете расширение mysqli, это не имеет большого значения. (хотя вы этого не делаете)

Обратите внимание, что в mysql эта кодировка называется utf8 , без тире или пробелов.

  1. Попробуйте установить выходную кодировку:

    SET NAMES 'utf-8' SET CHARACTER SET utf-8

  2. Создать файл .htaccess :

    AddDefaultCharset utf-8 AddCharset utf-8 * CharsetSourceEnc utf-8 CharsetDefault utf-8

  3. Сохраните файлы в UTF-8 без спецификации.

  4. Установите charset в html head.

После вашего 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");