Кодировки символов

В идеальном случае кодировка символов должна устанавливаться на уровне сервера и делать это согласно описанию в разделе » Конфигурация кодировки символов документации сервера 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);
?>