О кодировках MySQL

Ключевые отличия двух самых распространенных в данный момент:

1) utf8mb4_unicode_ci (Unicode 4.0) — основан на официальных правилах Unicode для универсальной сортировки и сравнения, что обеспечивает точную сортировку на широком спектре языков.

2) utf8mb4_general_ci — представляет собой упрощенный набор правил сортировки, цель которого — работать как можно лучше, используя множество сокращений, предназначенных для повышения скорости. Он не соответствует правилам Юникода и приведет к нежелательной сортировке или сравнению в некоторых ситуациях, например, при использовании определенных языков или символов.

На современных серверах это повышение производительности будет практически незначительным. Он был разработан в то время, когда серверы имели крошечную долю производительности ЦП современных компьютеров

Для тех, кто все еще задается этим вопросом в 2020 году или позже, есть более новые варианты, которые могут быть лучше, чем оба из них. Например, utf8mb4_0900_ai_ci.

utf8mb4_ru_0900_ai_ci — стандарт Unicode 9.0 (новые языки и новые эмодзи).

_ci — это сортировка и сравнение без учета регистра

_bin — Бинарные сопоставления специально предназначены для игнорирования культурных правил и работы на уровне байтов

Для бинарных сопоставлений обновленная кодировка — utf8mb4_0900_bin Разница между utf8mb4_0900_bin и utf8mb4_bin может быть заметна в реализации:

Преобразование регистра (основанная на более новой версии Unicode, скорее всего, имеет больше определений сопоставления)

Конечный пробел (utf8mb4_binигнорирует конечные пробелы, utf8mb4_0900_bin не игнорирует их)

Сортировка (у utf8mb4_0900_bin порядок сортировки такой же, как у utf8mb4_bin, но намного быстрее)

Пример 1:

CREATE DATABASE `dummydb` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_bin;

CREATE TABLE `dummy` (`key` VARCHAR(255) NOT NULL UNIQUE);

INSERT INTO `dummy` (`key`) VALUES (’one’);
INSERT INTO `dummy` (`key`) VALUES (’one ’);
INSERT INTO `dummy` (`key`) VALUES (’One’);
INSERT INTO `dummy` (`key`) VALUES (’öne’);

SELECT * FROM `dummy`;
На втором инсерте ожидается ошибка, остальные строки успешно вставятся. Для кодировки utf8mb4_bin это уникальные значения: one, One, öne

Пример 2:

CREATE DATABASE `dummydb` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_ru_0900_ai_ci;

CREATE TABLE `dummy` (`key` VARCHAR(255) NOT NULL UNIQUE);

INSERT INTO `dummy` (`key`) VALUES (’one’);
INSERT INTO `dummy` (`key`) VALUES (’one ’);
INSERT INTO `dummy` (`key`) VALUES (’One’);
INSERT INTO `dummy` (`key`) VALUES (’öne’);

SELECT * FROM `dummy`;
На третьем и четвертом инсерте ожидается ошибка, первые, две строки успешно вставятся. Для кодировки utf8mb4_ru_0900_ai_ci это НЕ уникальные значения: one, One, öne

Рекомендации:

1) utf8mb4_0900_bin

Если требуется сохранять уникальные символьные данные, без учета языковых особенностей и с четом регистра.

2) utf8mb4_ru_0900_ai_ci

Если это текстовые данные по которым подразумевается поиск или сортировка , поиск будет производится без учета регистра, с учетом языковых особенностей (например будут найдены и Е и Ё при поиске по одной из них).

 68   2 мес   mysql