Co dokładnie oznacza zestaw znaków i układanie?

315

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ć.

Szlifierka Versluys
źródło

Odpowiedzi:

511

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ń).

Dan Esparza
źródło
206

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.

mata
źródło
5
Należy zauważyć, że dla jednego zestawu znaków może istnieć wiele różnych zestawień. Ten, który jest „właściwy”, zależy od semantyki tekstu, który jest zwykle określany przez język, w którym jest napisany.
Phil
20

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.

erickson
źródło
przepraszam stary, jestem dopiero początkujący i potrzebuję tylko twoich wyjaśnień. Tak więc, czy mogę zrozumieć takie zestawienie, to właśnie to zapewnia, że ​​każda postać (łacińska lub chińska) jest odpowiednio rozpoznawana i otrzymuje odpowiednie kodowanie. Czy to jest poprawne? Mam nadzieję na twoją odpowiedź
Mirich,
1
@Mirich Nie, układanie to informacja o tym, jak sortować znaki. Różne regiony świata wolą sortować postacie na różne sposoby.
erickson,
3

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.

simhumileco
źródło
3
z PO: „Proszę o wyjaśnienie tych dwóch i jak je wybrać”
Dan Esparza
1
@simhumileco, przepraszam stary, jestem dopiero początkujący i potrzebuję tylko twojego wyjaśnienia. Tak więc, czy mogę zrozumieć takie zestawienie, to właśnie to zapewnia, że ​​każda postać (łacińska lub chińska) jest odpowiednio rozpoznawana i otrzymuje odpowiednie kodowanie. Czy to jest poprawne? Mam nadzieję na twoją odpowiedź
Mirich,
1
@Mirich Wszystko zależy od tego, jakiego kodowania używasz w innych miejscach, jeśli używasz UTF-8kodowania w systemie poza bazą danych, wtedy wszystko w bazie danych powinno być również poprawnie napisane, jeśli używasz utf8mb4w 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_cipewnością jest lepsze niż *_general, ale ma też swoje wady. Proszę przeczytać: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco