Введение: почему вопрос о 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 "Подключение успешно!";
?>