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?
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.
-
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.
-
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
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 dlautf8_general_ci
są szybsze, ale nieco mniej poprawne niż porównania dlautf8_unicode_ci
. Powodem tego jest to, żeutf8_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.
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