Кодировки символов
В идеальном случае кодировка символов должна устанавливаться на уровне сервера и делать это согласно описанию в разделе » Конфигурация кодировки символов документации сервера MySQL. В качестве альтернативы каждый MySQL API предлагает метод для установки кодировки символов во время выполнения.
Кодировка символов и экранирование символов
Кодировка символов должна быть четко определена, поскольку влияет на каждое действие, в том числе на действия с последствиями для безопасности. Например, механизмы экранирования (такие как mysqli_real_escape_string() для mysqli, mysql_real_escape_string() для mysql и 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");
printf("Первоначальная кодировка: %s\n", $mysqli->character_set_name());
if (!$mysqli->set_charset('utf8mb4')) {
printf("Ошибка загрузки кодировки utf8mb4: %s\n", $mysqli->error);
exit;
}
echo "Информация о новой кодировки:\n";
print_r( $mysqli->get_charset() );
?>
Пример #3 Пример установки кодировки символов: pdo_mysql
Примечание: Это работает только с PHP 5.3.6.
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>
Пример #4 Пример установки кодировки символов: mysql
<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db = mysql_select_db("world");
echo 'Первоначальная кодировка: ' . mysql_client_encoding($conn) . "\n";
if (!mysql_set_charset('utf8mb4', $conn)) {
echo "Ошибка: не удается установить кодировку.\n";
exit;
}
echo 'Ваша текущая кодировка: ' . mysql_client_encoding($conn);
?>