Каковы различия между utf8 general ci и utf8 unicode ci? [дубликат]


Возможные Дубликаты:
в чем разница между utf8_general_ci и utf8_unicode_ci

у меня есть два варианта unicode, которые выглядят многообещающими для базы данных mysql.

utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive

не могли бы вы объяснить, в чем разница между utf8_general_ci и utf8_unicode_ci? Каковы последствия выбора одного из них при проектировании базы данных?

2 76

2 ответа:

utf8_general_ci Это очень простой-и на Unicode, очень сломанный-сортировки, тот, который дает неверные результаты в общем текст в кодировке Unicode. Что он делает:

  • преобразуется в форму нормализации Юникода D для канонической декомпозиции
  • удаляет любые сочетания символов
  • преобразует в верхний регистр

это не работает правильно на Unicode, потому что он не понимает Unicode корпус. Корпус Юникода в одиночку это гораздо сложнее, чем ASCII-мыслящий подход может справиться. Например:

  • строчная "своих" "ß", но прописные ООО "ß" это "СС".
  • есть две строчные греческие Сигмы, но только одна заглавная; рассмотрим "σσσυφος".
  • буквы, такие как "ø", не разлагаются на "o" плюс диакритический знак, что означает, что он не будет правильно сортировать.

есть много других тонкостей.

  1. utf8_unicode_ci использует стандарт Алгоритм Сортировки Юникода, поддерживает так называемые расширения и лигатуры, например: Немецкая буква β (U + 00DF буква SHARP S) сортируется рядом с "ss" Буква Œ (U+0152 Латинская заглавная лигатура OE) сортируется рядом с "OE".

utf8_general_ci не поддерживает расширения/лигатуры, ее виды все эти буквы как отдельные символы, а иногда и в неправильном порядке.

  1. utf8_unicode_ci is вообще точнее для всех сценариев. Например, на кириллическом блоке: utf8_unicode_ci отлично подходит для всех этих языков: Русский, болгарский, белорусский, Македонский, сербский и украинский. В то время как utf8_general_ci подходит только для русского и болгарского подмножества кириллицы. Дополнительные буквы, используемые в белорусском, македонском, сербском и украинском языках сортируются не очень хорошо.

стоимостью utf8_unicode_ci что это мало бит медленнее, чем utf8_general_ci. Но это цена, которую вы платите за правильность. Либо у вас может быть быстрый ответ, который неверен, или очень медленный ответ, который прав. Ваш выбор. Очень трудно когда-либо оправдать дачу неправильных ответов, поэтому лучше всего предположить, что utf8_general_ci не существует и всегда использовать utf8_unicode_ci. Ну, если ты не хочешь неверных ответов.

источник:http://forums.mysql.com/read.php?103,187048, 188748#msg-188748

С Набор Символов Unicode на документация MySQL:

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