SET NAMES utf8 в MySQL?

Я часто вижу нечто похожее на это ниже в PHP-скриптах, используя MySQL

query("SET NAMES utf8"); 

Мне никогда не приходилось делать это для какого-либо проекта, но у меня есть пара основных вопросов.

  1. Это что-то, что сделано только с PDO?
  2. Если это не специфическая вещь PDO, то в чем цель этого? Я понимаю, что он устанавливает кодировку для mysql, но я имею в виду, что мне никогда не приходилось использовать его, так зачем мне его использовать?

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

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

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

Прочтите, следует ли использовать «НАЗВАНИЯ НАЗВАНИЙ», чтобы увидеть альтернативы SET NAMES и что именно это происходит.

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

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

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

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

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

  • браузер
  • страница
  • PHP
  • MySQL

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

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

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

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

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

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

преобразование

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

 SET NAMES 'cp1250'; 

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

 SET CHARSET 'utf8'; 

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

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

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

 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> 

Решение

  $conn->set_charset("utf8"); 

Вместо этого с помощью 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.

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

Спасибо всем!

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

какая-то мелочь в parctice:

положение дел:

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

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

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

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