Я часто вижу что-то подобное в сценариях PHP, использующих MySQL.
query("SET NAMES utf8");
Мне никогда не приходилось делать это ни для одного проекта, поэтому у меня есть пара основных вопросов по этому поводу.
- Это что-то, что делается только с PDO?
- Если это не специфическая вещь для PDO, то какова цель этого? Я понимаю, что он устанавливает кодировку для mysql, но я имею в виду, что мне никогда не приходилось ее использовать, так зачем мне ее использовать?
Ответы:
Это необходимо всякий раз, когда вы хотите отправить на сервер данные, содержащие символы, которые не могут быть представлены в чистом ASCII, например, «ñ» или «ö».
Это, если экземпляр MySQL не настроен на ожидание кодировки UTF-8 по умолчанию от клиентских подключений (многие из них, в зависимости от вашего местоположения и платформы).
Прочтите http://www.joelonsoftware.com/articles/Unicode.html, если вы не знаете, как работает Unicode.
Прочтите, следует ли использовать "SET NAMES", чтобы увидеть альтернативы SET NAMES и о чем именно они.
источник
SET NAMES UTF8
для них?SELECT
оператора.Из руководства :
Более подробно (и снова взяты из руководства ):
источник
Получить правильное кодирование действительно сложно - слишком много слоев:
Команда SQL «SET CHARSET utf8» из PHP гарантирует, что клиентская сторона (PHP) получит данные в utf8, независимо от того, как они хранятся в базе данных. Конечно, их сначала нужно правильно хранить.
Определение DDL и реальные данные
Кодировка, определенная для таблицы / столбца, на самом деле не означает, что данные находятся в этой кодировке. Если у вас есть таблица, определенная как,
utf8
но сохраненная как другая кодировка, MySQL будет рассматривать ее какutf8
и у вас проблемы. Это означает, что вы должны сначала это исправить.Что проверить
Вам нужно проверить, в какой кодировке поток данных на каждом уровне.
Убедитесь, что везде найдется нужный.
Преобразование
Если вы получаете данные, например
windows-1250
, и хотите их сохранитьutf-8
, используйте этот SQL перед сохранением:Если у вас есть данные в БД как
windows-1250
и вы хотите их восстановитьutf8
, используйте:Еще несколько заметок:
источник
Этот запрос должен быть написан перед запросом, который создает или обновляет данные в базе данных, этот запрос выглядит так:
Обратите внимание, что вы должны написать код, который вы используете, в заголовке, например, если вы используете utf-8, вы добавляете его в заголовке, иначе это вызовет проблему с Internet Explorer
так что ваша страница выглядит так
источник
Решение
источник
Вместо того, чтобы делать это через SQL-запрос, используйте функцию php: mysqli :: set_charset mysqli_set_charset
из http://www.php.net/manual/en/mysqli.set-charset.php
источник
Спасибо всем!
не используйте: query ("SET NAMES utf8"); это настройка, а не запрос. установите его сразу после начала соединения с помощью setCharset () (или аналогичного метода)
какая-то мелочь в parctice:
положение дел:
Сохранение и чтение данных не проблема, пока mysql может обрабатывать символы. если вы посмотрите в db, вы уже увидите, что там есть дерьмо (например, с помощью phpmyadmin).
до сих пор это не проблема! (неверно, но часто работает (в европе)) ..
..если другой клиент / программа или измененная библиотека, которая работает правильно, не будет читать / сохранять данные. тогда у вас большие неприятности!
источник
Не только PDO. Если sql ответит как "????" символы, предустановка вашей кодировки (надеюсь, UTF-8) действительно рекомендуется:
или через стиль процедуры
mysqli_set_charset($db,"utf8")
источник