Вопрос по mysql, html – UTF-8: правильно отображается в базе данных, но не в HTML, несмотря на кодировку utf-8

9

Я использую MySQL 5.1 и загружаю из txt-файла UTF-8 около 2,7 млн строк в таблицу, которая сама объявлена какutf8_unicode_ci а также все поля char объявлены какutf8_unicode_ci, с помощьюLOAD DATA INFILE...

В самой базе данных все символы выглядят правильно, все выглядит красиво. Однако, когда я печатаю их, используя php, символы отображаются как ???, хотя я использую объявление utf-8 в заголовке HTML:

<code><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
...
</code>

В другой таблице (с использованием utf-8), где я вставил текст из отправленной формы, символы странным образом отображаются в базе данных, но снова отображаются правильно, когда я печатаю их с помощьюSELECT....

Итак, мне было интересно: что не так? ЯвляютсяUTF-8 символы отображаются правильно в базе данных или странным образом, но когда выSELECT у них опять они в порядке? Или где проблема (при загрузке файла в БД, в HTML или где-то посередине) ??

Большое спасибо за любой намек или предложение! :)

Вы выпускаетеSET NAMES utf8оманда @ перед запуском MySQL запросов? Вы уверены, что ваша страница действительно отображается как utf-8 (если есть заголовок HTTPContent-Type: iso-8859-1, браузеры не согласны о том, что должно победить)? DCoder
В вашем PHP code, когда вы устанавливаете соединение с БД, вам нужно выполнитьSET NAMES utf8 чтобы сообщить MySQL, что вы будете отправлять и получать данные в формате UTF-8. Что касается заголовков HTTP, возможно, ваш php / Apache настроен на отправкуContent-Type: text/html;charset=iso-8859-1 заголовок с ответом. Если это произойдет, браузер может быть сбит с толку, если он будет отображать страницу как iso-8859-1 или utf-8. DCoder
@ DCoder: проблема в том, что я загрузил данные из файла и, поскольку у меня возникли проблемы с правильным путем к имени файла, я использовал интерфейс в phpmyadmin вместо чистой команды SQL (LOAD DATA INFILE) .. . а что ты имеешь ввиду под http-заголовком? извините, если это глупый вопрос, но совпадает ли он с http-эквивалентным = "Content-Type"? Chris
Я также предлагаю вам прочитать Joelonsoftware.com / статьи / Unicode.html, убедитесь, что вы используете ВЕЗДЕ кодировку utf8, хранилище MySQL, соединение MySQL, сам PHP, заголовок ответа, ... Styxxy
@ Styxxy: спасибо за ссылку на эту интересную статью! Chris

Ваш Ответ

2   ответа
8

но перед тем, как получать данные

$db->query('set character_set_client=utf8');
$db->query('set character_set_connection=utf8');
$db->query('set character_set_results=utf8');
$db->query('set character_set_server=utf8');
Спасибо, работал на меня. nowhere
куда поместить этот код? Praveen Yadav
@ PraveenYadav сразу после$db = new mysqli($host, $username, $password, $dbname); Chris K
Вы, сэр, только что спасли мой день! :) Shivanshu
12

MySQL'sutf8 charset ограничен, он поддерживает только символы Unicode в BMP, которые занимают не более трех байтов. Вы должны использоватьutf8mb4 вместо.

Убедитесь, что вы отправилиSET NAMES utf8 SET NAMES utf8mb4 команда MySQL после подключения, перед выполнением любых запросов MySQL. Убедитесь, что ваша страница действительно отображается как utf-8 (если есть заголовок HTTPContent-Type: text/html;charset=iso-8859-1, браузеры не согласны с тем, что должно победить). Читать эту статью: Обработка Unicode спереди назад в веб-приложении (но не забудьте заменитьutf8 сutf8mb4 что касается MySQL).

Если phpMyAdmin отображает введенные вами данные в виде правильного текста Unicode, тогда я уверен, что вы не делаетеSET NAMES utf8 после подключения.

Похожие вопросы