Я пытаюсь выяснить, какую сортировку я должен использовать для различных типов данных. 100% содержимого, которое я буду хранить, отправлено пользователем.
Насколько я понимаю, я должен использовать UTF-8 General CI (без учета регистра) вместо UTF-8 Binary. Однако я не могу найти четкого различия между UTF-8 General CI и UTF-8 Unicode CI.
- Должен ли я хранить пользовательский контент в столбцах UTF-8 General или UTF-8 Unicode CI?
- К какому типу данных будет применяться UTF-8 Binary?
utf8
используйтеutf8mb4
вместо полной поддержки UTF-8. Комментировать здесь, потому что ответы на этот популярный вопрос не решают эту проблему. mathiasbynens.be/notes/mysql-utf8mb4Ответы:
В общем, utf8_general_ci быстрее, чем utf8_unicode_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 выполняют сравнение без учета регистра. В отличие от этого , utf8_bin чувствителен к регистру (среди прочих различий), потому что он сравнивает двоичные значения символов.
источник
show collation;
позволяет просматривать параметры сортировки по умолчанию для каждого набора символов. 5.1 показываетutf8_general_ci
по умолчанию дляutf8
.Вам также следует учитывать тот факт, что при использовании utf8_general_ci при использовании поля varchar в качестве уникального или первичного индекса при вставке двух значений, таких как 'a' и 'á', возникнет ошибка дублирующегося ключа.
источник
utf8_unicode_ci
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–3-байтовыми кодами utf8. Это оставляет эмодзи и некоторые китайцы. Таким образом, вы действительно должны переключиться на,utf8mb4
если вы хотите выйти далеко за пределы Европы.Вышеуказанные пункты применяются к
utf8mb4
, после соответствующего изменения правописания. Идем впередutf8mb4
иutf8mb4_unicode_520_ci
предпочитаем.источник
Действительно, я протестировал сохранение значений, таких как 'é' и 'e', в столбце с уникальным индексом, и они вызвали двойную ошибку как в utf8_unicode_ci, так и в utf8_general_ci. Вы можете сохранить их только в сопоставленном столбце utf8_bin.
И документы mysql (в http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) предлагают в свои примеры набор параметров utf8_general_ci.
источник
Принятый ответ устарел.
Если вы используете MySQL 5.5.3+, используйте
utf8mb4_unicode_ci
вместоutf8_unicode_ci
чтобы символы, набранные вашими пользователями, не ошибок.utf8mb4
например, поддерживает emojis, тогда какutf8
может дать вам сотни ошибок, связанных с кодировкой, таких как:Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
источник
utf8mb4_unicode_ci
рассматривает (я думаю) все эмодзи как равные.utf8mb4_unicode_520_ci
дает приказ Emoji.