UTF-8: Общие? Бен? Unicode?

Я пытаюсь выяснить, какую сортировку я должен использовать для различных типов данных. 100% содержимого, которое я буду хранить, представлено пользователем.

Я понимаю, что я должен использовать UTF-8 General CI (без учета регистра) вместо UTF-8 Binary. Однако я не могу найти четкое различие между UTF-8 General CI и UIF-8 Unicode CI.

  1. Должен ли я хранить содержимое, представленное пользователями, в UTF-8 General или UTF-8 Unicode CI-столбцах?
  2. К какому типу данных применим бинарный код UTF-8?

В общем случае utf8_general_ci быстрее, чем utf8_unicode_ci , но менее корректен.

Вот разница:

Для любого набора символов Юникода операции, выполненные с использованием сопоставления _general_ci, быстрее, чем операции для сортировки _unicode_ci . Например, сравнение для сортировки utf8_general_ci выполняется быстрее, но немного менее корректно, чем сравнение для utf8_unicode_ci. Причиной этого является то, что utf8_unicode_ci поддерживает отображения, такие как разложения; то есть, когда один символ сравнивается с комбинациями других символов. Например, на немецком и некоторых других языках «ß» равно «ss». utf8_unicode_ci также поддерживает сжатие и игнорируемые символы. utf8_general_ci – это устаревшая сортировка, которая не поддерживает расширения, сокращения или игнорируемые символы. Он может проводить только взаимно однозначные сравнения между символами.

Цитата из: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

Для более подробного объяснения, пожалуйста, прочитайте следующее сообщение на форумах MySQL: http://forums.mysql.com/read.php?103,187048,188748

Что касается utf8_bin: Оба utf8_general_ci и utf8_unicode_ci выполняют сравнение без учета регистра. В constrast utf8_bin чувствителен к регистру (среди других различий), поскольку он сравнивает двоичные значения символов.

Вы также должны знать о том, что при использовании utf8_general_ci при использовании поля varchar в качестве уникального или первичного индекса вставки 2 значения, такие как «a» и «á», будут давать повторяющуюся ключевую ошибку.

  • utf8_bin сравнивает бит вслепую. Нет складчатости, без снятия акцента.
  • utf8_general_ci сравнивает один байт с одним байтом. Это делает фальсификацию случая и снятие акцента, но нет двухсимвольных сравнений: ij не равно ij в этом сопоставлении.
  • utf8_*_ci – это набор правил, специфичных для языка, но в остальном как unicode_ci . Некоторые частные случаи: Ç , Č , ch , ll
  • utf8_unicode_ci следует за старым стандартом Unicode для сравнения. ij = ij , но ae ! = æ
  • utf8_unicode_520_ci следует за новым стандартом Unicode. ae = æ

См. Таблицу сортировки для получения подробной информации о том, что равно количеству в разных командах utf8.

utf8 , как определено MySQL , ограничен 1-8-байтовыми utf8-кодами. Это исключает Эмоджи и некоторых китайцев. Поэтому вы действительно должны переключиться на utf8mb4 если хотите выйти далеко за пределы Европы.

Вышеуказанные пункты относятся к utf8mb4 после соответствующего изменения правописания. utf8mb4 , utf8mb4 и utf8mb4_unicode_520_ci являются предпочтительными.

  • utf16 и utf32 – варианты на utf8; для них практически не используется.
  • ucs2 ближе к «Unicode», чем «utf8»; для него практически не используется.

Действительно, я тестировал сохранение значений, таких как «é» и «e» в столбце с уникальным индексом, и они вызывают повторяющуюся ошибку на «utf8_unicode_ci» и «utf8_general_ci». Их можно сохранить только в столбце «utf8_bin».

И mysql docs (в http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) предлагают в своих примерах набор настроек «utf8_general_ci».

 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci 
Давайте будем гением компьютера.