Jakie są różnice między UTF8 ogólnym ci i utf8 unicode Ci? [duplikat]

Możliwy duplikat:
Jaka jest różnica między utf8_general_ci a utf8_unicode_ci

Mam dwie opcje dla unicode, które wyglądają obiecująco dla bazy danych 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 a utf8_unicode_ci? Jakie są efekty wyboru jednego nad drugim podczas projektowania bazy danych?

Author: Community, 2009-06-24

2 answers

utf8_general_ci jest to bardzo proste - i na Unicode, bardzo złamane - zestawienie, które daje nieprawidłowe wyniki na ogólnym tekście Unicode. To co robi to:

  • konwertuje do postaci normalizacji Unicode D dla rozkładu kanonicznego
  • usuwa znaki łączące
  • konwertuje na wielkie litery

To nie działa poprawnie na Unicode, ponieważ nie rozumie obudowy Unicode. Sama obudowa Unicode jest znacznie bardziej skomplikowana niż Podejście ASCII-minded może obsłużyć. Na przykład:

  • mała litera "" to "ß", ale wielka litera " ß "to " SS".
  • istnieją dwie małe Greckie Sigmy, ale tylko jedna wielka; rozważ "Σίσυφος".
  • litery takie jak "ø" nie rozkładają się na" o " plus znak diakrytyczny, co oznacza, że nie będzie poprawnie sortowane.
Jest wiele innych subtelności.
  1. utf8_unicode_ci używa standardu Unicode Collation Algorytm, obsługuje tzw. rozszerzenia i ligatury, na przykład: Niemiecka litera ß (u+00DF litera SHARP S) jest sortowana w pobliżu " ss" Litera Œ (u+0152 łacińska ligatura OE) jest sortowana w pobliżu "OE".

utf8_general_ci nie obsługuje rozszerzeń/ligatur, sortuje wszystkie te litery jako pojedyncze znaki, a czasami w złej kolejności.

  1. utf8_unicode_ci jest ogólnie bardziej dokładne dla wszystkich skryptów. Na przykład na bloku cyrylicy: utf8_unicode_ci jest w porządku dla wszystkie te języki: 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 języku białoruskim, macedońskim, serbskim i ukraińskim nie są dobrze posortowane.

Koszt utf8_unicode_ci jest taki, że jest to mały bit wolniej niż utf8_general_ci. Ale to jest cena, którą płacisz za poprawność. Albo możesz mieć szybką odpowiedź, która jest zła, albo bardzo nieco wolniejszą odpowiedź, która jest racja. Twój wybór. Bardzo trudno jest usprawiedliwić dawanie błędnych odpowiedzi, więc najlepiej założyć, że utf8_general_ci nie istnieje i zawsze używać utf8_unicode_ci. Chyba, że chcesz złych odpowiedzi.

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

 122
Author: Timotei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 05:48:54

Z zestawów znaków Unicode W dokumentacji MySQL :

Dla dowolnego zestawu znaków Unicode operacje wykonywane przy użyciu kolacji _general_ci Są szybsze niż w przypadku kolacji _unicode_ci. Na przykład porównania dla 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 mapowania, takie jak Rozszerzenia; to znaczy, gdy jeden znak porównuje się jako równy kombinacjom innych postaci. Na przykład w języku niemieckim i niektórych innych językach "ß" jest równe "ss". utf8_unicode_ci obsługuje również skróty i znaki ignorowane. utf8_general_ci jest dziedzicznym zestawieniem, które nie obsługuje rozszerzeń, skrótów ani ignorowalnych postaci. Może dokonywać tylko porównań między znakami jeden do jednego.

 19
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 04:55:51