2009-06-24 26 views
75

Powiel możliwe:
What's the difference between utf8_general_ci and utf8_unicode_ciJakie są różnice między utf8_general_ci i utf8_unicode_ci?

Mam dwie opcje dla unicode, które wyglądają obiecujące dla bazy mysql.

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

Czy możesz wyjaśnić, jaka jest różnica między utf8_general_ci i utf8_unicode_ci? Jakie są skutki wyboru jednego przy drugim przy projektowaniu bazy danych?

+0

Zobacz również http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci – unor

Odpowiedz

119

utf8_general_ci jest bardzo prosta - i na Unicode, bardzo łamanego - zestawień, jeden, który daje nieprawidłowych wyników na ogólnych tekstu Unicode. Co robi jest:

  • konwertuje do Unicode formularza normalizacja D do rozkładu kanonicznego
  • usuwa wszelkie łączenie znaków
  • zamienia się wielkimi literami

To nie działa poprawnie na Unicode, gdyż nie rozumie obudowy Unicode. Samo kodowanie Unicode jest o wiele bardziej skomplikowane, niż może obsłużyć podejście ASCII. Na przykład:

  • Małe litery "ẞ" to "ß", ale wielkie litery "ß" to "SS".
  • Istnieją dwie małe litery greckie, ale tylko jedna wielka; rozważ "Σίσυφος".
  • Litery takie jak "ø" nie rozkładają się na "o" plus znak diakrytyczny, co oznacza, że ​​nie posortuje się poprawnie.

Istnieje wiele innych subtelności.

  1. utf8_unicode_ci wykorzystuje standard Unicode Collation Algorithm, wspiera tzw ekspansje i ligatury, na przykład: niemieckie SS nas (U + 00DF LIST SHARP S) jest sortowany w pobliżu "ss" List OE (U + 0152 LATIN CAPITAL podwiązanie OE) jest sortowane w pobliżu "OE".

utf8_general_ci nie obsługuje rozszerzające/ligatur, sortuje wszystkie te listy jako pojedynczych znaków, a czasami w niewłaściwej kolejności.

  1. utf8_unicode_ci jest ogólnie bardziej dokładne dla scenariuszy. Na przykład na cyrylicy: utf8_unicode_ci jest w porządku dla wszystkich tych języków: Rosyjski, bułgarski, białoruski, macedoński, serbski i ukraiński. Podczas gdy utf8_general_ci jest w porządku tylko dla rosyjskiego i bułgarskiego podzbioru cyrylicy. Dodatkowe litery używane w białoruskim, macedońskim, serbskim i ukraińskim są sortowane nie za dobrze.

Koszt utf8_unicode_ci jest to, że jest to trochę nieco wolniej niż utf8_general_ci. Ale to cena, którą płacisz za poprawność. Albo możesz otrzymać szybką odpowiedź, która jest zła, albo bardzo nieznacznie wolniejszą odpowiedź, która jest właściwa. Twój wybór. Bardzo trudno jest uzasadnić udzielanie błędnych odpowiedzi, więc najlepiej jest założyć, że utf8_general_ci nie istnieje i zawsze używać utf8_unicode_ci. Cóż, chyba że chcesz złych odpowiedzi.

Źródło: http://forums.mysql.com/read.php?103,187048,188748#msg-188748

+1

Rekwizyty listy języków – reconbot

+3

wygląda ta odpowiedź została skopiowana prosto z forum mysql http://forums.mysql.com/read.php?103,187048,188748#msg-188748 – Matt

+0

@Matt: cóż, niektórzy z nas wyszukują w google: P – Timotei

19

Od Unicode Character Sets w MySQL documentation:

Dla każdego zestawu znaków Unicode, operacje wykonywane przy użyciu _general_ci sortowania są szybsze niż te dla _unicode_ci zestawień. Na przykład porównania dla zestawienia utf8_general_ci są szybsze, ale nieco mniej poprawne niż porównania dla utf8_unicode_ci. Powodem tego jest to, że utf8_unicode_ci obsługuje odwzorowania takie jak rozszerzenia; to znaczy, gdy jeden znak jest porównywany z kombinacjami innych znaków. Na przykład w języku niemieckim i niektórych innych językach "ß" jest równy "ss". utf8_unicode_ci obsługuje również skurcze i znaki nie do zapamiętania. utf8_general_ci jest starszym układaniem, które nie obsługuje rozszerzeń, skurczów lub znaków nie do zapamiętania. Może wykonywać tylko porównania jeden do jednego między znakami.

Powiązane problemy