Каковы различия между utf8_general_ci и utf8_unicode_ci?

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

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

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

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

Ответ 1

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

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

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

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

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

  • utf8_unicode_ci использует стандартный алгоритм сортировки Unicode, поддерживает так называемые расширения и лигатуры, например: Немецкая буква ß (U + 00DF LETTER SHARP S) сортируется рядом с "ss" Письмо Œ (U + 0152 LATIN CAPITAL LIGATURE OE) сортируется рядом с "OE".

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

  1. utf8_unicode_ci, как правило, более точен для всех скриптов. Например, на кириллице: 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

Ответ 2

Из Unicode Character Sets в Документация по MySQL:

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