Какая collation в MySQL с PHP лучшая? Полный туториал

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

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

Начать курс

Введение: почему вопрос о 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. Решение:

Блоги

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