Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jakie są różnice między utf8_general_ci a utf8_unicode_ci?

utf8_general_ci jest bardzo prostym — i w Unicode, bardzo uszkodzonym — sortowaniem, które daje niepoprawne wyniki na ogólnym tekście Unicode. Robi to:

  • konwertuje do postaci D normalizacji Unicode w celu rozkładu kanonicznego
  • usuwa wszelkie połączone znaki
  • konwertuje na wielkie litery

To nie działa poprawnie na Unicode, ponieważ nie rozumie wielkości liter Unicode. Sama wielkość liter Unicode jest znacznie bardziej skomplikowana niż podejście oparte na ASCII. Na przykład:

  • Małe litery „ẞ” to „ß”, ale duże „ß” to „SS”.
  • Istnieją dwie greckie sigma z małymi literami, ale tylko jedna wielka; rozważ „Σίσυφος”.
  • Litery takie jak „ø” nie rozkładają się na „o” plus znak diakrytyczny, co oznacza, że ​​nie będą poprawnie sortowane.

Istnieje wiele innych subtelności.

  1. utf8_unicode_ci używa standardowego Algorytmu sortowania Unicode , obsługuje tzw. rozszerzenia i ligatury, na przykład:niemiecka litera ß (U+00DF LETTER SHARP S) jest sortowana w pobliżu „ss”Litera Œ (U+0152 LATIN CAPITAL LIGATURE OE) jest sortowana w pobliżu „OE”.

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

  1. utf8_unicode_ci jest ogólnie dokładniejsze dla wszystkich skryptów. Na przykład w bloku cyrylicy:utf8_unicode_ci jest w porządku dla wszystkich tych języków:rosyjskiego, bułgarskiego, białoruskiego, macedońskiego, serbskiego i ukraińskiego. 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 nie są dobrze posortowane.

Koszt utf8_unicode_ci jest to, że jest małe nieco wolniej niż utf8_general_ci . Ale to cena, jaką płacisz za poprawność. Albo możesz uzyskać szybką odpowiedź, która jest nieprawidłowa, albo nieco wolniejszą odpowiedź, która jest prawidłowa. Twój wybór. Bardzo trudno jest kiedykolwiek uzasadnić udzielanie błędnych odpowiedzi, więc najlepiej 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przykład użycia bind_result vs get_result

  2. Usuń z dołączeniem w MySQL

  3. Połącz Metabase z MySQL w celu eksploracji danych

  4. Zapytanie MySQL — rekordy od dnia dzisiejszego do ostatnich 30 dni

  5. Kod błędu:2013. Utracono połączenie z serwerem MySQL podczas zapytania