УСТАНОВИТЬ ИМЕНА utf8 в MySQL? - PullRequest
105 голосов
/ 29 января 2010

Я часто вижу что-то подобное ниже в сценариях PHP, использующих MySQL

query("SET NAMES utf8");   

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

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

Ответы [ 8 ]

69 голосов
/ 29 января 2010

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

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

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

Чтение Использовать ли "SET NAMES" для просмотра альтернатив SET NAMES и что это такое.

43 голосов
/ 29 января 2010

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

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

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

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

30 голосов
/ 09 января 2013

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

  • Браузер
  • Page
  • 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.
18 голосов
/ 18 сентября 2012

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

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>
8 голосов
/ 09 апреля 2016

Решение

 $conn->set_charset("utf8");
5 голосов
/ 09 марта 2014

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

1 голос
/ 05 января 2014

Спасибо @all!

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

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

Статус:

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

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

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

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

0 голосов
/ 24 января 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...