В идеальном случае кодировка символов должна устанавливаться на уровне сервера и делать это согласно описанию в разделе » Конфигурация кодировки символов документации сервера MySQL. В качестве альтернативы каждый MySQL API предлагает метод для установки кодировки символов во время выполнения.
Кодировка символов должна быть чётко определена, поскольку влияет на каждое действие, в том числе на действия с последствиями для безопасности. Например, механизмы экранирования (такие как mysqli_real_escape_string() для mysqli и PDO::quote() для PDO_MySQL) зависят от этих настроек. Важно понимать, что эти функции не используют кодировку символов определённую в запросе, так например, следующие запросы не будут влиять на поведение этих функций:
Пример #1 Проблемы установки кодировки символов с помощью SQL
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
// Этот запрос не влияет на поведение $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8mb4");
// И этот не влияет на $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8mb4");
// но вот этот запрос повлияет на поведение $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');
// а этот НЕ повлияет, потому что нельзя использовать "-"
$mysqli->set_charset('UTF-8'); // (utf8mb4, а не UTF-8)
?>
Примеры ниже демонстрируют, как правильно изменять кодировку символов во время выполнения, используя каждый из API.
Замечание: Возможная путаница с UTF-8
Поскольку имена кодировок символов в MySQL не содержат тире/дефис, строка "utf8" применяется в MySQL для установки кодировки UTF-8 (до 3 байт в кодировке Unicode UTF-8). Строка "UTF-8" неприемлема и выбросит ошибку при установке кодировки символов.
Пример #2 Пример установки кодировки символов: mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
echo 'Первоначальная кодировка: ' . $mysqli->character_set_name() . "\n";
if (!$mysqli->set_charset('utf8mb4')) {
printf("Ошибка загрузки кодировки utf8mb4: %s\n", $mysqli->error);
exit;
}
echo 'Ваша текущая кодировка: ' . $mysqli->character_set_name() . "\n";
?>
Пример #3 Пример установки кодировки символов: pdo_mysql
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>