УСТАНОВИТЬ ИМЕНА utf8 в MySQL?
Я часто вижу что-то похожее на это ниже в сценариях PHP, использующих MySQL
query("SET NAMES utf8");
Мне никогда не приходилось делать это для какого-либо проекта, поэтому у меня есть пара основных вопросов по этому поводу.
- Это то, что делается только с PDO?
- Если это не специфическая для PDO вещь, то для чего это нужно? Я понимаю, что это устанавливает кодировку для mysql, но я имею в виду, мне никогда не приходилось ее использовать, так зачем мне ее использовать?
8 ответов
Это необходимо всякий раз, когда вы хотите отправить данные на сервер, содержащие символы, которые не могут быть представлены в чистом ASCII, например, "ñ" или "ö".
Это если экземпляр MySQL не настроен на ожидание кодировки UTF-8 по умолчанию от клиентских подключений (многие из них, в зависимости от вашего местоположения и платформы).
Прочтите http://www.joelonsoftware.com/articles/Unicode.html если вы не знаете, как работает Unicode.
Прочитайте, следует ли использовать "SET NAMES", чтобы увидеть альтернативы 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';
Если у вас есть данные в БД как 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>
Вместо того, чтобы делать это через 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 для получения дополнительной информации.
Спасибо всем!
не используйте: query("SET NAMES utf8"); это настройка, а не запрос. Поместите это сразу после начала соединения с помощью setCharset() (или аналогичного метода)
какая-то мелочь в parctice:
статус:
- MySQL сервер по умолчанию говорит по-латински
- ваше дырочное приложение в utf8
- соединение устанавливается без каких-либо дополнительных (так: latin1) (нет SET NAMES utf8 ..., нет set_charset() метод / функция)
Хранить и читать данные не проблема, поскольку mysql может обрабатывать символы. если вы посмотрите в базу данных, то уже увидите, что в ней есть дерьмо (например, с помощью phpmyadmin).
до сих пор это не проблема! (неправильно, но работает часто (в Европе))..
..не если другой клиент / программа или измененная библиотека, которая работает правильно, будет читать / сохранять данные. тогда у вас большие проблемы!
Не только PDO. Если SQL ответит как "????" символы, предустановленные из вашей кодировки (надеюсь, UTF-8) действительно рекомендуется:
if (!$mysqli->set_charset("utf8"))
{ printf("Can't set utf8: %s\n", $mysqli->error); }
или через стиль процедуры mysqli_set_charset($db,"utf8")