Вопрос по mysql, unicode – Каковы различия между utf8_general_ci и utf8_unicode_ci? [Дубликат]

78

Possible Duplicate:
What's the difference between utf8_general_ci and utf8_unicode_ci

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

<code>utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive
</code>

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

Смотрите такжеstackoverflow.com/questions/766809/… unor

Ваш Ответ

2   ответа
125

utf8_general_ci это очень просто & # x2014; и на Unicode, очень сломанный & # x2014; сопоставление, которое даетincorrect results на общий текст Unicode. Что это делает:

converts to Unicode normalization form D for canonical decomposition removes any combining characters converts to upper case

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

The lowercase of “ẞ” is “ß”, but the uppercase of “ß” is “SS”. There are two lowercase Greek sigmas, but only one uppercase one; consider “Σίσυφος”. Letters like “ø” do not decompose to an “o” plus a diacritic, meaning that it won’t correctly sort.

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

utf8_unicode_ci uses the standard Unicode Collation Algorithm, supports so called expansions and ligatures, for example: German letter ß (U+00DF LETTER SHARP S) is sorted near "ss" Letter Œ (U+0152 LATIN CAPITAL LIGATURE OE) is sorted near "OE".

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

utf8_unicode_ci is generally more accurate for all scripts. For example, on Cyrillic block: utf8_unicode_ci is fine for all these languages: Russian, Bulgarian, Belarusian, Macedonian, Serbian, and Ukrainian. While utf8_general_ci is fine only for Russian and Bulgarian subset of Cyrillic. Extra letters used in Belarusian, Macedonian, Serbian, and Ukrainian are sorted not well.

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

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

Error: User Rate Limit Exceededforums.mysql.com/read.php?103,187048,188748#msg-188748
Error: User Rate Limit Exceeded reconbot
Error: User Rate Limit Exceededutf8_general_ci http://stackoverflow.com/a/766996/570763
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededutf8_general_ciError: User Rate Limit Exceededutf8_unicode_ciError: User Rate Limit Exceeded
19

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

For any Unicode character set, operations performed using the _general_ci collation are faster than those for the _unicode_ci collation. For example, comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci. The reason for this is that utf8_unicode_ci supports mappings such as expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages “ß” is equal to “ss”. utf8_unicode_ci also supports contractions and ignorable characters. utf8_general_ci is a legacy collation that does not support expansions, contractions, or ignorable characters. It can make only one-to-one comparisons between characters.

Похожие вопросы