SET NAMES utf8 в MySQL?

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

query("SET NAMES utf8");   

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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

Вам необходимо проверить, в какой кодировке проходит поток данных на каждом слое.

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

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

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

SET NAMES 'cp1250';

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

SET CHARSET 'utf8';

Еще несколько заметок:

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

Ответ 4

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

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>

Ответ 5

Решение

 $conn->set_charset("utf8");

Ответ 6

Вместо того, чтобы делать это с помощью 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

Ответ 7

Спасибо @all!

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

какая-то мелочь в партике:

статус:

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

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

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

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

Ответ 8

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

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

или через стиль процедуры mysqli_set_charset($db,"utf8")