Potrafię czytać dokumentację MySQL i jest to całkiem jasne. Ale jak decydować, którego zestawu znaków użyć? Na jakie dane ma wpływ sortowanie?
Proszę o wyjaśnienie tych dwóch i jak je wybrać.
Potrafię czytać dokumentację MySQL i jest to całkiem jasne. Ale jak decydować, którego zestawu znaków użyć? Na jakie dane ma wpływ sortowanie?
Proszę o wyjaśnienie tych dwóch i jak je wybrać.
Odpowiedzi:
Z dokumentów MySQL :
Zestaw znaków to zestaw symboli i kodowań. Sortowania jest zbiorem reguł porównywania znaków w zestawie znaków. Wyjaśnijmy to rozróżnienie na przykładzie fikcyjnego zestawu znaków.
Załóżmy, że mamy alfabet z czterema literami: „A”, „B”, „a”, „b”. Każdej literze nadajemy liczbę: „A” = 0, „B” = 1, „a” = 2, „b” = 3. Litera „A” jest symbolem, cyfra 0 to kodowanie „A” , a kombinacja wszystkich czterech liter i ich kodowania jest zestawem znaków.
Załóżmy teraz, że chcemy porównać dwie wartości ciągu, „A” i „B”. Najprostszym sposobem na to jest sprawdzenie kodowania: 0 dla „A” i 1 dla „B”. Ponieważ 0 jest mniejsze niż 1, mówimy, że „A” jest mniejsze niż „B”. Teraz właśnie zastosowaliśmy zestawienie do naszego zestawu znaków. Zestawienie to zestaw reguł (w tym przypadku tylko jedna reguła): „porównaj kodowanie”. To najprostsze ze wszystkich możliwych zestawień nazywamy zestawieniem binarnym.
Ale co, jeśli chcemy powiedzieć, że małe i wielkie litery są równoważne? Wtedy mielibyśmy co najmniej dwie reguły: (1) traktuj małe litery „a” i „b” jako równoważne z „A” i „B”; (2), a następnie porównaj kodowania. Nazywamy to sortowaniem bez rozróżniania wielkości liter. Jest to trochę bardziej skomplikowane niż sortowanie binarne.
W prawdziwym życiu większość zestawów znaków ma wiele znaków: nie tylko „A” i „B”, ale całe alfabety, czasami wiele alfabetów lub wschodni system pisma z tysiącami znaków, a także wiele specjalnych symboli i znaków interpunkcyjnych. Również w prawdziwym życiu większość zestawień ma wiele reguł: nie tylko rozróżnianie wielkości liter, ale także niewrażliwość na akcent („akcent” jest znakiem przypisanym do znaku jak w niemieckim „ö”) i odwzorowaniem wielu znaków (np. Reguła „ ö '= „OE” w jednym z dwóch niemieckich zestawień).
Kodowanie znaków jest sposobem znaków kodują tak aby zmieścić się w pamięci. Oznacza to, że jeśli zestaw znaków to ISO-8859-15, symbol euro, €, będzie zakodowany jako 0xa4, a w UTF-8 będzie to 0xe282ac.
Sortowania jest jak porównać znaków, w latin9 istnieją litery e é è ê f
, jeśli klasyfikowane według ich reprezentacji binarnej, to pójdzie e f é ê è
, ale jeśli sortowania jest ustawiony, na przykład, francuski, trzeba je w kolejności, w jakiej myśleli byłoby, co oznacza, że wszystkie e é è ê
są równe, a następnie f
.
Zestaw znaków jest podzbiorem wszystkich zapisanych glifów. Kodowanie znaków określa sposób mapowania tych znaków na wartości liczbowe. Niektóre kodowania znaków, takie jak UTF-8 i UTF-16, mogą kodować dowolny znak w Uniwersalnym zestawie znaków. Inne, takie jak US-ASCII lub ISO-8859-1, mogą kodować tylko mały podzbiór, ponieważ używają odpowiednio 7 i 8 bitów na znak. Ponieważ wiele standardów określa zarówno zestaw znaków, jak i kodowanie znaków, termin „zestaw znaków” często zastępuje się „kodowaniem znaków”.
Zestawienie zawiera reguły określające sposób porównywania znaków w celu sortowania. Reguły porządkowania mogą być specyficzne dla regionu: właściwa kolejność dwóch znaków różni się w zależności od języka.
Wybór zestawu znaków i sortowania sprowadza się do tego, czy aplikacja jest internacjonalizowana, czy nie. Jeśli nie, na jakie lokalizacje celujesz?
Aby wybrać zestaw znaków, który chcesz obsługiwać, musisz rozważyć swoją aplikację. Jeśli przechowujesz dane dostarczone przez użytkownika, może być trudno przewidzieć wszystkie lokalizacje, w których oprogramowanie będzie ostatecznie używane. Aby wesprzeć je wszystkie, najlepiej może być obsługa UCS (Unicode) od samego początku. Jednak wiąże się to z pewnymi kosztami; wiele znaków z Europy Zachodniej będzie teraz wymagać dwóch bajtów pamięci na znak zamiast jednego.
Wybór odpowiedniego sortowania może poprawić wydajność, jeśli baza danych używa tego sortowania do utworzenia indeksu, a później używa tego indeksu w celu zapewnienia posortowanych wyników. Ponieważ jednak reguły sortowania są często specyficzne dla ustawień regionalnych, indeks ten będzie bezwartościowy, jeśli trzeba posortować wyniki zgodnie z regułami dla innych ustawień regionalnych.
Proponuję użyć utf8mb4_unicode_ci
, który jest oparty na standardzie Unicode do sortowania i porównywania, który sortuje dokładnie w bardzo szerokim zakresie języków.
UTF-8
kodowania w systemie poza bazą danych, wtedy wszystko w bazie danych powinno być również poprawnie napisane, jeśli używasz utf8mb4
w MySQL . Jeśli chodzi o poprawne działanie sortowania, porównywania i przekształcania tekstu dla określonych znaków w MySQL , trudno jest znaleźć idealne rozwiązanie, ale z *_unicode_ci
pewnością jest lepsze niż *_general
, ale ma też swoje wady. Proszę przeczytać: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html