Введение: почему вопрос о collation в MySQL — это не просто каприз эстета
Каждый, кто хоть раз настраивал базу данных под PHP-проект, сталкивался с вопросом: «А какую collation (сравнение/сортировку) выбрать?». На Stack Overflow этот вопрос собрал тысячи просмотров, а ответы на него часто путают новичков. На первый взгляд, кажется, что разницы нет — лишь бы работало. Но на деле выбор collation влияет на скорость поиска, корректность сортировки (особенно с русским языком) и даже на то, как будут отображаться спецсимволы.
В этом туториале мы разберёмся, какая collation для MySQL с PHP действительно лучшая в 2025 году, и почему. Вы узнаете, как избежать классических ошибок и настроить базу данных так, чтобы сайт летал, а данные не превращались в кракозябры.
Что такое collation простыми словами?
Collation (сравнение) — это набор правил, по которым MySQL сравнивает и сортирует строки. Она тесно связана с кодировкой (charset). Если кодировка (например, utf8mb4) отвечает за то, как символы хранятся, то collation определяет, как они сравниваются: учитывать ли регистр, как сортировать буквы «ё» и «е», считать ли «A» и «a» одинаковыми.
Основные типы collation для utf8mb4:
- utf8mb4_general_ci — старая, быстрая, но с упрощённой сортировкой (не всегда корректно обрабатывает некоторые языки).
- utf8mb4_unicode_ci — более точная, основанная на стандарте Unicode, но до версии MySQL 8.0 была медленнее.
- utf8mb4_0900_ai_ci — новейшая (MySQL 8.0+), самая точная и быстрая одновременно.
Почему не стоит использовать старые collation?
Многие legacy-проекты до сих пор живут с utf8_general_ci или даже latin1_swedish_ci. Если вы пишете новый проект на PHP, избегайте их как огня. Вот почему:
- Проблемы с русским языком: «ё» и «е» могут сортироваться неверно.
- Ограниченный набор символов: старые кодировки не поддерживают эмодзи и редкие символы.
- Производительность: современные collation оптимизированы и работают быстрее.
Лучшая collation в 2025: utf8mb4_0900_ai_ci
Если ваш MySQL версии 8.0 или выше (а так сейчас у большинства), то лучший выбор — utf8mb4_0900_ai_ci. Расшифровка:
- utf8mb4 — кодировка, поддерживающая 4 байта на символ (эмодзи, редкие иероглифы).
- 0900 — основана на стандарте Unicode 9.0 (самая актуальная версия).
- ai — accent insensitive (нечувствительность к ударениям: «café» и «cafe» равны).
- ci — case insensitive (регистронезависимость: «Hello» и «hello» равны).
Эта collation обеспечивает максимальную точность и скорость. Если вам нужно различать регистр или ударения, используйте utf8mb4_0900_as_cs, но для 99% веб-проектов ai_ci — идеал.
А что если у меня MySQL 5.7 или ниже?
Тогда ваш выбор — utf8mb4_unicode_520_ci (или просто utf8mb4_unicode_ci). Она не такая быстрая, как 0900, но гораздо точнее, чем general_ci. Если у вас старая версия — срочно обновляйтесь, но пока живёте с ней, используйте utf8mb4_unicode_ci.
Пошаговый туториал: настройка collation в PHP-проекте
Давайте настроим базу данных правильно. Я покажу на примере PDO — современного и безопасного способа работы с MySQL в PHP.
Шаг 1. Создание базы данных с правильной collation
Выполните этот SQL-запрос (через phpMyAdmin или консоль):
CREATE DATABASE my_database
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
Шаг 2. Настройка подключения в PHP (PDO)
При подключении к базе обязательно укажите кодировку. Это гарантирует, что все запросы будут использовать правильную collation.
<?php
$host = 'localhost';
$dbname = 'my_database';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Подключение успешно!";
} catch (PDOException $e) {
die("Ошибка подключения: " . $e->getMessage());
}
?>
Обратите внимание на charset=utf8mb4 в DSN. Без этого PHP может использовать кодировку по умолчанию (часто latin1), и все ваши усилия пойдут насмарку.
Шаг 3. Создание таблиц с явной collation
Даже если база настроена правильно, лучше явно указывать collation для каждой таблицы. Особенно если вы импортируете данные из другого источника.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
Шаг 4. Пример поиска и сортировки с учётом collation
Теперь, когда всё настроено, давайте посмотрим, как это работает на практике. Допустим, у нас есть таблица с товарами, и мы ищем «ёлка».
<?php
$search = 'ёлка';
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(['%' . $search . '%']);
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($products as $product) {
echo $product['name'] . "<br>";
}
?>
Благодаря collation utf8mb4_0900_ai_ci, поиск найдёт и «ёлка», и «елка», и «ЁЛКА» — регистр и наличие точек над «ё» не имеют значения. Сортировка тоже будет корректной.
Частые ошибки и как их избежать
- Ошибка 1: Использование устаревшей кодировки latin1. Решение: