Эти два сопоставления предназначены для кодировки символов UTF-8. Различия в том, как текст сортируется и сравнивается.
Примечание. Начиная с MySQL 5.5.3, вы должны использовать utf8mb4
вместо utf8
. Оба они ссылаются на кодировку UTF-8, но более старый utf8
имел специфичное для MySQL ограничение, запрещающее использование символов с номерами выше 0xFFFD.
Точность
utf8mb4_unicode_ci
основан на стандарте Unicode для сортировки и сравнения, который точно сортирует на самых разных языках.
utf8mb4_general_ci
не в состоянии реализовать все правила сортировки Unicode, что приведет к нежелательной сортировке в некоторых ситуациях, например при использовании определенных языков или символов.
Производительность
utf8mb4_general_ci
быстрее при сравнении и сортировке, потому что для этого требуется множество ярлыков, связанных с производительностью.
На современных серверах это повышение производительности будет практически незначительным. Он был разработан в то время, когда серверы имели небольшую долю производительности ЦП современных компьютеров.
utf8mb4_unicode_ci
, который использует правила Unicode для сортировки и сравнения, использует довольно сложный алгоритм для правильной сортировки в широком диапазоне языков и при использовании широкого диапазона специальных символов. Эти правила должны учитывать языковые соглашения; не каждый сортирует своих персонажей в том, что мы назвали бы «алфавитным порядком».
Что касается латиницы (то есть "европейских") языков, между сортировкой Unicode и упрощенной utf8mb4_general_ci
сортировкой в MySQL нет большой разницы, но есть еще несколько отличий:
Например, параметры сортировки Unicode сортируют "ß", например, "ss", и "" ", например," OE ", как обычно хотят люди, использующие эти символы, тогда как utf8mb4_general_ci
сортирует их как отдельные символы (предположительно, как "s" и "e" соответственно).
Некоторые символы Юникода определены как игнорируемые, что означает, что они не должны учитываться в порядке сортировки, а сравнение должно перейти к следующему символу. utf8mb4_unicode_ci
обрабатывает их правильно.
В нелатинских языках, таких как азиатские языки или языки с разными алфавитами, может быть много больше различий между сортировкой Unicode и упрощенной сортировкой utf8mb4_general_ci
. Пригодность utf8mb4_general_ci
будет сильно зависеть от используемого языка. Для некоторых языков это будет совершенно неадекватно.
Что вы должны использовать?
Почти наверняка нет смысла использовать utf8mb4_general_ci
, поскольку мы оставили точку, когда скорость процессора достаточно низкая, чтобы разница в производительности была важной. Ваша база данных почти наверняка будет ограничена другими узкими местами, кроме этой.
Разница в производительности будет ощутима только в крайне специализированных ситуациях, и если это вы, вы, вероятно, уже знаете об этом. Если вы испытываете медленную сортировку, почти во всех случаях это будет проблемой с вашими индексами / планом запросов. Изменение функции сортировки не должно занимать одно из первых мест для устранения неполадок.
В прошлом некоторые люди рекомендовали использовать utf8mb4_general_ci
, за исключением случаев, когда точная сортировка должна была стать достаточно важной, чтобы оправдать снижение производительности. Сегодня эта производительность почти исчезла, и разработчики относятся к интернационализации более серьезно.
Еще одна вещь, которую я добавлю, заключается в том, что даже если вы знаете, что ваше приложение поддерживает только английский язык, оно все равно может иметь дело с именами людей, которые часто могут содержать символы, используемые в других языках, для которых оно так же важно правильно сортировать. Использование правил Unicode для всего помогает добавить душевного спокойствия, что очень умные люди Unicode очень усердно работали, чтобы заставить сортировку работать правильно.