Próbuję dowiedzieć się, jakiego sortowania powinienem używać dla różnych typów danych. 100% treści, które będę przechowywać, jest przesłane przez użytkownika.
Rozumiem, że powinienem używać UTF-8 General CI (bez rozróżniania wielkości liter) zamiast UTF-8 Binary. Nie mogę jednak znaleźć wyraźnego rozróżnienia między CI UTF-8 General CI a CI UTF-8 Unicode.
- Czy powinienem przechowywać treści przesłane przez użytkowników w kolumnach UTF-8 General lub UTF-8 Unicode CI?
- Do jakiego rodzaju danych miałoby zastosowanie UTF-8 Binary?
utf8
użyjutf8mb4
zamiast tego, aby uzyskać pełną obsługę UTF-8. Komentując tutaj, ponieważ odpowiedzi na to popularne pytanie nie rozwiązują tego. mathiasbynens.be/notes/mysql-utf8mb4Odpowiedzi:
Ogólnie rzecz biorąc, utf8_general_ci jest szybszy niż utf8_unicode_ci , ale mniej poprawny.
Oto różnica:
Cytat z: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Aby uzyskać bardziej szczegółowe wyjaśnienia, przeczytaj następujący post z forów MySQL: http://forums.mysql.com/read.php?103,187048,188748
Jeśli chodzi o utf8_bin: Zarówno utf8_general_ci, jak i utf8_unicode_ci wykonują porównanie bez rozróżniania wielkości liter. W przeciwieństwie do tego w utf8_bin rozróżniana jest wielkość liter (między innymi różnicami), ponieważ porównuje wartości binarne znaków.
źródło
show collation;
pozwala zobaczyć domyślne sortowanie dla każdego zestawu znaków. 5.1 pokazujeutf8_general_ci
jako domyślny dlautf8
.Należy również pamiętać o tym, że w przypadku utf8_general_ci podczas używania pola varchar jako indeksu unikalnego lub podstawowego wstawienie 2 wartości, takich jak „a” i „á”, spowodowałoby powtórzenie błędu klucza.
źródło
utf8_unicode_ci
utf8_bin
porównuje bity na ślepo. Bez składania skrzynek, bez usuwania akcentów.utf8_general_ci
porównuje jeden bajt z jednym bajtem. Składa skrzynie i usuwanie akcentów, ale nie ma 2-znakowych porównań:ij
nie jest równyij
w tym zestawieniu.utf8_*_ci
jest zbiorem reguł specyficznych dla języka, ale poza tym jest podobnyunicode_ci
. Niektóre przypadki szczególne:Ç
,Č
,ch
,ll
utf8_unicode_ci
w porównaniu porównuje się ze starym standardem Unicode.ij
=ij
, aleae
! =æ
utf8_unicode_520_ci
jest zgodny z nowszym standardem Unicode.ae
=æ
Zobacz tabelę zestawień, aby uzyskać szczegółowe informacje na temat tego, co jest równe co w różnych zestawieniach utf8.
utf8
, zgodnie z definicją MySQL, jest ograniczony do 1- do 3-bajtowych kodów utf8. To pomija Emoji i niektóre chińskie. Dlatego naprawdę powinieneś się przestawić na,utf8mb4
jeśli chcesz wyjść daleko poza Europę.Powyższe punkty dotyczą
utf8mb4
, po odpowiedniej zmianie pisowni. Idąc dalejutf8mb4
iutf8mb4_unicode_520_ci
są preferowane.źródło
Naprawdę przetestowałem zapisywanie wartości takich jak „é” i „e” w kolumnie z unikalnym indeksem i powodują one zduplikowany błąd zarówno w „utf8_unicode_ci”, jak i „utf8_general_ci”. Możesz zapisać je tylko w kolumnie „utf8_bin”.
A mysql docs (w http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) sugeruje w swoich przykładach zestawienie „utf8_general_ci”.
źródło
Zaakceptowana odpowiedź jest nieaktualna.
Jeśli używasz MySQL 5.5.3+, użyj
utf8mb4_unicode_ci
zamiast,utf8_unicode_ci
aby upewnić się, że znaki wpisywane przez użytkowników nie będą powodować błędów.utf8mb4
obsługuje na przykład emoji,utf8
ale może dostarczyć setki błędów związanych z kodowaniem, takich jak:Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
źródło
utf8mb4_unicode_ci
traktuje (jak sądzę) wszystkie emoji jako równe.utf8mb4_unicode_520_ci
wydaje zamówienie Emoji.