Co dokładnie oznacza zestaw i zestawienie znaków?

Mogę odczytać dokumentację MySQL i to całkiem jasne. Ale w jaki sposób można zdecydować, który zestaw znaków użyć? Na jakie dane wpływa zestawienie?

Proszę o wyjaśnienie tych dwóch i jak je wybrać.

Author: simhumileco, 2008-12-04

4 answers

From MySQL docs :

A zestaw znaków jest zbiorem symboli i kodowania. Zbiór jest zbiorem Zasady porównywania znaków w zestaw znaków. Zróbmy rozróżnienie jasne na przykładzie wyimaginowany zestaw znaków.

Załóżmy, że mamy alfabet z cztery litery: "A", "B", "a", "b". My nadaj każdej literze cyfrę: "A" = 0, "B" = 1, " a "= 2, " b " = 3. List "A" jest symbolem, Liczba 0 jest na kodowanie dla "A" oraz kombinacja wszystkich czterech liter i ich kodowanie jest zestawem znaków.

Przypuśćmy, że chcemy porównać dwie wartości łańcuchowe, " A " i "B". Na najprostszym sposobem na to jest spojrzenie na kodowania: 0 dla " A " i 1 dla "B". Ponieważ 0 jest mniejsze niż 1, mówimy "A" jest mniejsze niż "B". Teraz, co mamy wystarczy zastosować zestawienie do naszego zestaw znaków. Zestawienie jest zbiorem zasad (tylko jedna zasada w tym przypadku): "porównaj kodowanie."Nazywamy to najprostszy ze wszystkich możliwych zestawień a zestawienie binarne.

Ale co jeśli chcemy powiedzieć, że małe i wielkie litery to ekwiwalent? Wtedy mielibyśmy w co najmniej dwie zasady: (1) traktuj małe litery " a " i " b " jako równoważne "A" i "B"; (2) wtedy porównaj kodowania. Nazywamy to nie rozróżnia wielkości liter. To jest trochę bardziej złożony niż binarny zestawienie.

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 pismo Wschodnie systemy z tysiącami znaków, wraz z wieloma specjalnymi symbolami i znaki interpunkcyjne. Również w prawdziwym życiu, większość zestawień ma wiele zasad: nie tylko niewrażliwość, ale także niewrażliwość akcentu ("akcent" jest znak dołączony do znaku jak w Niemieckie "ö") i wieloznakowe mapowania (np. zasada, że "ö" = "OE" w jednym z dwóch niemieckich kolacje).

 456
Author: Dan Esparza,
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
2015-06-11 13:57:56

A kodowanie znaków jest sposobem kodowania znaków tak, aby pasowały do pamięci. Oznacza to, że jeśli kod jest ISO-8859-15, symbol euro, €, będzie zakodowany jako 0XA4, a w UTF-8 będzie to 0xe282ac.

The collation to sposób porównywania znaków, w języku łacińskim9 są litery e é è ê f , jeśli posortowane są według ich reprezentacji binarnej, pójdzie e f é ê è, ale jeśli sortowanie jest ustawione na, na przykład, francuski, będziesz miał je w kolejności, w jakiej myślałeś, że będą, co jest wszystkie {[2] } są równe, a następnie f.

 181
Author: mat,
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
2016-05-30 12:18:22

Zestaw znaków jest podzbiorem wszystkich zapisanych glifów. Kodowanie znaków określa sposób odwzorowania 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" jest często zastępowany dowolnie dla "kodowania znaków".

Zestawienie zawiera reguły określające sposób porównywania znaków w celu sortowania. Reguły zestawiania mogą być specyficzne dla danego języka: właściwa kolejność dwóch znaków różni się w zależności od języka.

Wybór zestawu znaków i zestawienie sprowadza się do tego, czy aplikacja jest internacjonalizowana, czy nie. Jeśli nie, to w jakiej lokalizacji celujesz?

Aby wybrać, jaki zestaw znaków chcesz obsługiwać, musisz wziąć pod uwagę swój podanie. Jeśli przechowujesz dane wejściowe dostarczone przez użytkownika, może być trudno przewidzieć wszystkie lokalizacje, w których oprogramowanie zostanie ostatecznie użyte. Aby je wszystkie obsługiwać, najlepiej będzie od samego początku obsługiwać UCS (Unicode). Jest to jednak kosztowne; wiele zachodnioeuropejskich znaków będzie teraz wymagało dwóch bajtów pamięci na znak zamiast jednego.

Wybór odpowiedniego zestawienia może pomóc w wydajności, jeśli baza danych używa tego zestawienia do tworzenia indeksu, a później używa ten indeks, aby dostarczyć posortowane wyniki. Jednakże, ponieważ reguły sortowania są często specyficzne dla locale, indeks ten będzie bezwartościowy, jeśli trzeba sortować wyniki zgodnie z regułami innych locale.

 20
Author: erickson,
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
2008-12-04 17:42:29

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.

 3
Author: simhumileco,
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-03-06 11:58:38