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")