печать unicode в php из базы данных MySQL приводит к ошибке кодирования [дубликат]

8 ответов

Это необходимо, когда вы хотите отправить данные на сервер с символами, которые не могут быть представлены в чистом ASCII, например «ñ» или «ö».

Это, если экземпляр MySQL не настроен на ожидайте кодировку UTF-8 по умолчанию из клиентских подключений (многие из них зависят от вашего местоположения и платформы.)

Прочитайте http://www.joelonsoftware.com/articles/Unicode.html , если вы не знаете, как работает Unicode.

Прочтите Использовать & SET SET NAMES & quot; , чтобы увидеть альтернативы SET NAMES и что именно это значит.

68
ответ дан Community 19 August 2018 в 00:12
поделиться
  • 1
    'ö' и '-' расширены ASCII. Вам все еще нужно SET NAMES UTF8 для них? – Tim 26 June 2011 в 08:12
  • 2
    Я обнаружил, что мне часто приходится добавлять utf8_decode ($ my_text); в PHP, чтобы получить специальные символы UTF-8 для правильного отображения на веб-сайтах, когда данные были запрошены из MySQL. Мои таблицы и столбцы установлены в UTF-8 в MySQL, так что это необходимо? – NexusRex 30 August 2011 в 20:15
  • 3
    Это похоже на то, что ваш HTML не кодируется в UTF-8 – Vinko Vrsalovic 30 August 2011 в 21:04
  • 4
    @ Vinko Vrsalovic: Не обязательно ... У меня были все мои файлы в utf8, но у моего предыдущего хостера был набор символов mysql, установленный на latin1, и потому, что я не сказал mysql, что я отправляю символы в utf8 (следовательно, устанавливаю имена utf8), он хранит их в латинской кодировке и все мои специальные символы (словенский čšž) выглядели так, будто они были захвачены автомобилем - еще одно: когда вы проводите поиск в phpmyadmin, вы не найдете результатов, потому что č подобен Å и так далее – Erik Čerpnjak 23 June 2015 в 13:40
  • 5
    Обратите внимание, что он также указывает набор символов, который сервер должен использовать для отправки результатов обратно клиенту, поэтому также необходим при получении этих данных, используя, например, оператор SELECT. – Leopoldo Sanczyk 20 November 2015 в 21:54

Не только PDO. Если sql ответить как '????' символы, пресеты из вашей кодировки (надежда UTF-8) действительно рекомендуются:

if (!$mysqli->set_charset("utf8")) 
 { printf("Can't set utf8: %s\n", $mysqli->error); }

или с помощью стиля процедуры mysqli_set_charset($db,"utf8")

0
ответ дан dmitry_podyachev 19 August 2018 в 00:12
поделиться

Этот запрос должен быть написан перед запросом, который создает или обновляет данные в базе данных, этот запрос выглядит так:

mysql_query("set names 'utf8'");

Обратите внимание, что вы должны написать кодировку, которую вы используете в заголовке для Например, если вы используете utf-8, вы добавляете его так же, как в заголовке, или это вызовет проблему с Internet Explorer

, чтобы ваша страница выглядела как

<html>
    <head>
        <title>page title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "INSERT * FROM ..... ";  
            mysql_query($sql);
    ?>    

    </body>
<html>
17
ответ дан j0k 19 August 2018 в 00:12
поделиться
  • 1
    Вы не должны использовать библиотеку mysql PHP, вместо этого вы должны использовать MySQLi или PDO. – André Figueira 16 November 2012 в 14:41

Из руководства :

SET NAMES указывает, какой символ будет использоваться клиентом для отправки операторов SQL на сервер.

Более подробно (и опять же, безвозмездно снято с руководства ):

SET NAMES указывает, какой набор символов будет использоваться клиентом для отправки операторов SQL в сервер. Таким образом, SET NAMES 'cp1251' сообщает серверу, что «будущие входящие сообщения от этого клиента находятся в наборе символов cp1251». Он также указывает набор символов, который сервер должен использовать для отправки результатов обратно клиенту. (Например, он указывает, какой символ должен использоваться для значений столбца, если вы используете инструкцию SELECT.)

42
ответ дан karim79 19 August 2018 в 00:12
поделиться
  • 1
    Просто заставил вас сходить на 100 тысяч сэр! : D – David 25 July 2012 в 13:28
  • 2
    Я люблю тебя. Просто сделал мой вечер! – karim79 25 July 2012 в 21:48

Решение

 $conn->set_charset("utf8");
8
ответ дан nurp 19 August 2018 в 00:12
поделиться

Получение права кодирования действительно сложно: слишком много слоев:

  • Браузер
  • Страница
  • PHP
  • MySQL

Команда SQL «SET CHARSET utf8» из PHP гарантирует, что клиентская сторона (PHP) получит данные в utf8, независимо от того, как они хранятся в базе данных. Конечно, они должны быть правильно сохранены.

Определение DDL и реальных данных

Кодировка, определенная для таблицы / столбца, на самом деле не означает, что данные находятся в этой кодировке , Если у вас есть таблица, определенная как utf8, но сохраненная как различная кодировка, тогда MySQL будет рассматривать их как utf8, и у вас проблемы. Это означает, что вам нужно сначала исправить это.

Что проверить

Вам нужно проверить, какая кодировка потока данных на каждом уровне.

  • Проверьте HTTP-заголовки, заголовки.
  • Проверьте, что действительно отправлено в теле запроса.
  • Не забывайте, что MySQL имеет кодировку почти везде: Таблицы базы данных Столбцы Сервер в целом Клиент Make что во всем есть правильный.

Конверсия

Если вы получаете данные, например. windows-1250 и хотите сохранить в utf-8, затем используйте этот SQL перед сохранением:

SET NAMES 'cp1250';

Если у вас есть данные в DB как windows-1250 и вы хотите вернуться utf8, используйте:

SET CHARSET 'utf8';

Последнее примечание:

Не используйте слишком «умные» инструменты для отображения данных. Например. phpMyAdmin делает (делал, когда я его использовал) кодирование действительно плохо. И он проходит через все слои, поэтому его трудно узнать. Кроме того, в Internet Explorer было действительно глупо поведение «угадывания» кодировки, основанной на странных правилах. Используйте простые редакторы, где вы можете переключать кодировку. Кроме того, я рекомендую MySQL Workbench.

27
ответ дан Ondra Žižka 19 August 2018 в 00:12
поделиться

Вместо этого с помощью SQL-запроса используйте функцию php: mysqli :: set_charset mysqli_set_charset

Note:

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

Дополнительную информацию см. в разделе концепций набора символов MySQL.

< / blockquote>

из http://www.php.net/manual/en/mysqli.set-charset.php

4
ответ дан user1783273 19 August 2018 в 00:12
поделиться

Спасибо @all!

не использовать: query ("SET NAMES utf8"); это настройка, а не запрос. положите это прямо на начало соединения с setCharset () (или аналогичным методом)

немного мелочи в parctice:

status:

  • mysql server по умолчанию переговоры latin1
  • ваше приложение-отверстие находится в utf8
  • соединение выполняется без каких-либо дополнительных (так: latin1) (нет SET NAMES utf8 ..., no set_charset () method / function)

Сохранять и читать данные не проблема, так как long mysql может обрабатывать символы. если вы посмотрите в db, вы уже увидите, что в нем есть дерьмо (например, использование phpmyadmin).

до сих пор это не проблема! (неправильно, но работает часто (в европе)) ..

.. если другой клиент / программа или измененная библиотека, которая работает правильно, будут читать / сохранять данные. то у вас большие неприятности!

1
ответ дан user3162905 19 August 2018 в 00:12
поделиться
Другие вопросы по тегам:

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