Выбор кодировки MySQL для PHP: туториал с решением

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему вопрос о collation в MySQL до сих пор актуален?

Если вы когда-либо сталкивались с задачей настройки базы данных MySQL для PHP-приложения, то наверняка видели в phpMyAdmin или в конфигурационных файлах загадочные термины вроде utf8mb4_general_ci или latin1_swedish_ci. Вопрос «What is the best collation to use for MySQL with PHP?» — один из самых популярных на Stack Overflow, и на это есть веские причины.

Неправильный выбор кодировки может привести к тому, что русские буквы превратятся в кракозябры, сортировка данных сломается, а эмодзи (да-да, те самые смайлики) просто перестанут сохраняться в базу. В этом туториале мы раз и навсегда разберемся, какую collation выбрать для современного PHP-проекта, и я покажу вам пошаговый код для настройки.

Что такое collation в MySQL и почему это важно для PHP?

Collation (сопоставление, кодировка сравнения) — это набор правил, по которым MySQL сравнивает строки. Она определяет:

  • Регистронезависимость — будет ли 'A' равно 'a' при поиске.
  • Порядок сортировки — как будут располагаться строки в результатах запроса.
  • Поддержка символов — какие именно символы (включая кириллицу, иероглифы, эмодзи) могут храниться.

Для PHP-разработчика это критически важно, потому что:

  • Вы работаете с пользовательским вводом (формы, комментарии, посты).
  • Современные приложения должны поддерживать Unicode (эмодзи, спецсимволы).
  • Неверная collation ломает сравнение строк в WHERE-условиях.

Основные типы collation: разбор популярных вариантов

1. utf8_general_ci — старый добрый стандарт

Долгое время это был стандарт де-факто. Он быстр, но имеет один серьезный недостаток: не поддерживает символы за пределами Basic Multilingual Plane (BMP). Это значит, что эмодзи 🚀, символы древних языков и редкие китайские иероглифы не будут сохраняться. Кроме того, правила сравнения упрощены (например, 'ß' может не совпадать с 'ss', как в немецком).

2. utf8mb4_general_ci — улучшенная версия

Здесь mb4 означает «multibyte 4» — поддержка 4-байтовых символов. Это уже решает проблему с эмодзи. Однако правила сравнения остаются упрощенными. Если вам не важна лингвистическая точность (например, для обычного блога), это отличный выбор.

3. utf8mb4_unicode_ci — золотой стандарт (мой выбор)

Это лучшая collation для большинства современных PHP-проектов. Она использует алгоритм сравнения Unicode Collation Algorithm (UCA), который:

  • Правильно обрабатывает кириллицу, латиницу, азиатские языки.
  • Корректно сортирует строки по алфавиту (например, 'ё' и 'е' будут стоять рядом, а не в разных местах).
  • Поддерживает эмодзи и все символы Unicode.

Единственный минус — чуть медленнее, чем general_ci, но в 99% случаев разница незаметна.

4. utf8mb4_unicode_520_ci и utf8mb4_0900_ai_ci — новейшие версии

В MySQL 8.0 появились улучшенные варианты. utf8mb4_0900_ai_ci — это самый современный стандарт на основе Unicode 9.0. Он еще точнее, но требует MySQL 8.0+. Если ваш хостинг поддерживает это — используйте его. Для старых версий (MySQL 5.7 и ниже) берите utf8mb4_unicode_ci.

Пошаговый туториал: настройка collation для PHP-проекта

Давайте перейдем к практике. Я покажу, как правильно настроить соединение с MySQL, чтобы ваше PHP-приложение работало с utf8mb4_unicode_ci.

Шаг 1: Выбор кодировки для базы данных и таблиц

Создайте базу данных с явным указанием кодировки. Вы можете сделать это через SQL или phpMyAdmin:

CREATE DATABASE my_database
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

Если база уже существует, измените её кодировку:

ALTER DATABASE my_database
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

Шаг 2: Настройка таблиц

Убедитесь, что каждая таблица использует правильную collation. При создании:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Для существующих таблиц выполните:

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Шаг 3: Настройка соединения PHP с MySQL (PDO — правильный путь)

Самый важный шаг — установить кодировку при подключении. Если вы используете PDO (рекомендуемый способ), сделайте это через DSN:

<?php
$host = 'localhost';
$dbname = 'my_database';
$username = 'root';
$password = '';

try {
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $username,
        $password,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
    );
    echo "Подключение успешно!";
} catch (PDOException $e) {
    die("Ошибка подключения: " . $e->getMessage());
}
?>

Обратите внимание на charset=utf8mb4 в строке DSN. Это заставляет PHP отправлять MySQL команду SET NAMES utf8mb4 при каждом соединении.

Шаг 4: Настройка через mysqli (если вы используете старый API)

Для mysqli код выглядит так:

<?php
$mysqli = new mysqli($host, $username, $password, $dbname);
if ($mysqli->connect_error) {
    die("Ошибка подключения: " . $mysqli->connect_error);
}

// Устанавливаем кодировку
if (!$mysqli->set_charset("utf8mb4")) {
    printf("Ошибка загрузки кодировки: %s\n", $mysqli->error);
}
echo "Подключение успешно!";
?>

Блоги

Рекомендаций по книгам