UTF-8: генерал? Бин? Юникод?


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

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

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

4 ответа:

В общем, utf8_general_ci быстрее utf8_unicode_ci, но менее правильный.

вот в чем разница:

для любого набора символов Unicode, операции, выполняемые с помощью параметров сортировки _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 выполнить сравнение без учета регистра. В отличии от этого, utf8_bin чувствителен к регистру (среди других различий), потому что это сравнивает двоичные значения символов.

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

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

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

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

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

  • utf16 и utf32-это варианты на utf8; они практически не используются.
  • ucs2 ближе к "Unicode", чем" utf8"; он практически не используется.

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

и mysql docs (in 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