Jeśli kiedykolwiek pracowałeś z MySQL, nieuchronnie natrafiłeś na zestawy znaków i zestawienia. W tym poście na blogu postaramy się dokładniej przyjrzeć się tym dwóm i sposobom ich używania.
Czym są zestawy znaków i zestawienia?
Po prostu zestawy znaków w MySQL to zestawy symboli i kodowań - sortowanie to zestawy reguł do porównywania znaków w zestawie znaków. Innymi słowy, zestawy znaków to zestawy znaków, które są dozwolone w ciągu, podczas gdy sortowanie to zestaw reguł używanych do porównywania znaków w określonym zestawie znaków. Tak jak każdy zestaw znaków ma domyślne sortowanie, zestawy znaków mogą również mieć kilka sortowań. MySQL ma domyślny zestaw znaków i sortowanie dla serwera, a także dla każdej bazy danych i tabeli.
Zestawy znaków w MySQL
Na ogół zestawy znaków w MySQL działają tak:
- Kiedy baza danych jest tworzona, zestawy znaków są wyprowadzane ze zmiennej character_set_server obejmującej cały serwer.
- Gdy tworzona jest tabela, zestawy znaków pochodzą z bazy danych.
- Gdy tworzona jest kolumna, zestawy znaków pochodzą z tabeli.
Jeśli chodzi o zestawy znaków, należy zwrócić uwagę na kilka zmiennych:
- Character_set_client definiuje zestaw znaków, w którym oświadczenia są wysyłane przez klienta.
- Character_set_connection definiuje zestaw znaków, na który instrukcje są tłumaczone po otrzymaniu przez serwer instrukcji od klienta.
- Character_set_results definiuje zestaw znaków, w którym serwer zwraca wyniki zapytania do klienta.
Te trzy ustawienia można zmienić za pomocą instrukcji SET NAMES lub SET CHARACTER SET, a nawet w plikach konfiguracyjnych MySQL.
Podczas pracy z zestawami znaków czasami możesz również napotkać błąd #1267:
ERROR 1267 (HY000): Illegal mix of collations.
Powyższy błąd jest zwykle spowodowany porównaniem dwóch ciągów, które mają niezgodne sortowanie lub próbą wybrania danych, które mają inne sortowanie w połączonej kolumnie. Błąd jest wyświetlany, ponieważ gdy MySQL porównuje dwie wartości z różnymi zestawami znaków, musi je przekonwertować na ten sam zestaw znaków do porównania, ale zestawy znaków nie są kompatybilne. Aby rozwiązać ten problem, upewnij się, że sortowanie każdej tabeli i ich kolumn są takie same.
Układania w MySQL
Jak już wspomniano powyżej, sortowanie jest ściśle związane z zestawami znaków, ponieważ sortowanie to zestaw reguł definiujących sposób porównywania i sortowania ciągów znaków. Każdy zestaw znaków ma co najmniej jedno zestawienie, niektóre mają również więcej.
Chociaż w tym poście na blogu nie będziemy wchodzić w szczegóły dotyczące sortowania w MySQL, jest kilka rzeczy, o których warto wiedzieć:
- Jeśli używasz MySQL 5.7, domyślnym sortowaniem MySQL jest zazwyczaj latin1_swedish_ci, ponieważ MySQL używa latin1 jako domyślnego zestawu znaków. Jeśli używasz MySQL 8.0, domyślnym kodowaniem jest utf8mb4.
- Jeśli zdecydujesz się używać UTF-8 jako sortowania, zawsze używaj utf8mb4 (w szczególności utf8mb4_unicode_ci). Nie powinieneś używać UTF-8, ponieważ UTF-8 w MySQL różni się od właściwego kodowania UTF-8. Dzieje się tak, ponieważ nie oferuje pełnej obsługi Unicode, co może prowadzić do utraty danych lub problemów z bezpieczeństwem. Należy pamiętać, że utf8mb4_general_ci to uproszczony zestaw reguł sortowania, który wykorzystuje skróty zaprojektowane w celu zwiększenia szybkości, podczas gdy utf8mb4_unicode_ci sortuje dokładnie w wielu językach. Ogólnie rzecz biorąc, utf8mb4 jest „najbezpieczniejszym” zestawem znaków, ponieważ obsługuje również 4-bajtowy kod Unicode, podczas gdy utf8 obsługuje tylko do 3.
Wybór dobrego zestawu znaków i sortowania
Aby wybrać dobre sortowanie i zestaw znaków dla swojego zestawu danych MySQL, pamiętaj o prostocie. Mieszanka różnych zestawów znaków i (lub) zestawień może być prawdziwym bałaganem, ponieważ mogą być bardzo mylące (na przykład wszystko może działać dobrze, dopóki nie pojawią się określone znaki itp.), więc najlepiej jest ocenić swoje potrzeby z góry i wybrać najlepsze zestawienie i ustawienie znaków z góry. MySQL ma również kilka cennych zapytań, które mogą Ci w tym pomóc, na przykład
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
zwróci listę zestawów znaków i dostępnych sortowań wraz z ich opisem, co może być niezwykle przydatne, jeśli planujesz projekt bazy danych.
Pamiętaj, że niektóre zestawy znaków mogą wymagać więcej operacji procesora, a także mogą zajmować więcej miejsca w pamięci. Używanie niewłaściwych zestawów znaków może nawet uniemożliwić indeksowanie - na przykład MySQL musi konwertować zestawy znaków, aby móc je porównać, gdy nie są takie same:konwersja może uniemożliwić użycie indeksu.
Pamiętaj też, że niektórzy zalecają „po prostu używać UTF-8 globalnie” – może to niekoniecznie być świetny pomysł, ponieważ wiele aplikacji w ogóle nie potrzebuje UTF-8 i, w zależności od na Twoich danych, UTF-8 może powodować więcej problemów, niż jest to warte (na przykład może zużywać znacznie więcej miejsca na dysku), więc wybieraj mądrze.
Podsumowanie
Zestawy i zestawienia postaci mogą być Twoimi przyjaciółmi lub koszmarem - wszystko zależy od tego, jak ich użyjesz. Ogólnie rzecz biorąc, należy pamiętać, że „dobry” zestaw znaków i sortowanie zależą od danych przechowywanych w bazie danych — MySQL dostarcza kilka zapytań, które pomogą Ci zdecydować, czego użyć, ale aby Twoje zestawy znaków i sortowania były efektywne, powinieneś również pomyśleć o tym, kiedy ma sens użycie określonego sortowania i dlaczego.