Pokud jste někdy pracovali s MySQL, nevyhnutelně jste narazili na znakové sady a porovnávání. V tomto příspěvku na blogu se vám pokusíme poskytnout podrobnější pohled na to, co tyto dva jsou a jak byste je měli používat.
Co jsou znakové sady a řazení?
Zjednodušeně řečeno, znakové sady v MySQL jsou sady symbolů a kódování – kolace jsou sady pravidel pro porovnávání znaků ve znakové sadě. Jinými slovy, znakové sady jsou sady znaků, které jsou v řetězci povolené, zatímco kolace jsou sada pravidel používaných k porovnání znaků v konkrétní znakové sadě. Stejně jako má každá znaková sada výchozí řazení, znakové sady mohou mít také několik řazení. MySQL má výchozí znakovou sadu a řazení pro server a také pro každou databázi a tabulku.
Znakové sady v MySQL
Obecně znakové sady v MySQL fungují takto:
- Při vytvoření databáze jsou znakové sady odvozeny z proměnné character_set_server na celém serveru.
- Při vytvoření tabulky jsou znakové sady odvozeny z databáze.
- Když je vytvořen sloupec, znakové sady jsou odvozeny z tabulky.
Pokud jde o znakové sady, existuje několik proměnných, na které byste měli dávat pozor:
- Character_set_client definuje znakovou sadu, ve které jsou příkazy odesílány klientem.
- Character_set_connection definuje znakovou sadu, do které se příkazy překládají poté, co server obdrží příkaz od klienta.
- Character_set_results definuje znakovou sadu, ve které server vrací výsledky dotazu klientovi.
Tato tři nastavení lze změnit pomocí příkazů SET NAMES nebo SET CHARACTER SET nebo dokonce v konfiguračních souborech MySQL.
Při práci se znakovými sadami se někdy můžete setkat také s chybou #1267:
ERROR 1267 (HY000): Illegal mix of collations.
Výše uvedená chyba je obecně způsobena porovnáváním dvou řetězců, které mají nekompatibilní řazení, nebo pokusem o výběr dat, která mají odlišné řazení, do kombinovaného sloupce. Chyba se zobrazí, protože když MySQL porovnává dvě hodnoty s různými znakovými sadami, musí je pro porovnání převést na stejnou znakovou sadu, ale znakové sady nejsou kompatibilní. Chcete-li tento problém vyřešit, ujistěte se, že řazení každé tabulky a jejich sloupce jsou stejné.
Řazení v MySQL
Jak již bylo zmíněno výše, řazení úzce souvisí se znakovými sadami, protože řazení je sada pravidel, která definují, jak porovnávat a třídit znakové řetězce. Každá znaková sada má alespoň jedno řazení, některé mají také více.
I když v tomto příspěvku na blogu nebudeme zabíhat do podrobných podrobností o všech věcech týkajících se řazení v MySQL, je několik věcí, které byste měli vědět:
- Pokud používáte MySQL 5.7, výchozí řazení MySQL je obecně latin1_swedish_ci, protože MySQL používá jako výchozí znakovou sadu latin1. Pokud používáte MySQL 8.0, výchozí znaková sada je utf8mb4.
- Pokud se rozhodnete jako řazení použít UTF-8, vždy používejte utf8mb4 (konkrétně utf8mb4_unicode_ci). UTF-8 byste neměli používat, protože UTF-8 MySQL se liší od správného kódování UTF-8. Je tomu tak proto, že nenabízí plnou podporu unicode, což může vést ke ztrátě dat nebo problémům se zabezpečením. Mějte na paměti, že utf8mb4_general_ci je zjednodušená sada pravidel třídění, která používá zkratky navržené pro zvýšení rychlosti, zatímco utf8mb4_unicode_ci třídí přesně v široké škále jazyků. Obecně platí, že utf8mb4 je „nejbezpečnější“ znaková sada, protože také podporuje 4bajtové unicode, zatímco utf8 podporuje pouze až 3.
Výběr dobré znakové sady a řazení
Chcete-li vybrat dobré řazení a znakovou sadu pro datovou sadu MySQL, pamatujte na to, aby to bylo jednoduché. Směs různých znakových sad a (nebo) porovnávání může být skutečným nepořádkem, protože mohou být velmi matoucí (například může vše fungovat dobře, dokud se neobjeví určité znaky atd.), takže je nejlepší předem zhodnotit své potřeby a vybrat tu nejlepší. řazení a znaková sada předem. MySQL má také několik cenných dotazů, které vám s tím mohou pomoci, například
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
vrátí seznam znakových sad a dostupných řazení spolu s jejich popisem, což může být velmi užitečné, pokud plánujete návrh databáze.
Mějte na paměti, že některé znakové sady mohou vyžadovat více operací CPU a také mohou zabírat více úložného prostoru. Použití nesprávných znakových sad může dokonce zabránit indexování – například MySQL musí převést znakové sady, aby je mohla porovnat, když nejsou stejné:převod může znemožnit použití indexu.
Mějte také na paměti, že někteří lidé doporučují „pouze globálně používat UTF-8“ – to nemusí být nutně skvělý nápad, protože mnoho aplikací dokonce UTF-8 vůbec nepotřebuje a v závislosti na na vašich datech může UTF-8 způsobit více problémů, než stojí za to (například může zabrat mnohem více úložného prostoru na disku), takže vybírejte moudře.
Přehled
Sady postav a porovnávání mohou být vašimi přáteli nebo jednou z vašich nočních můr – vše záleží na tom, jak je používáte. Obecně mějte na paměti, že „dobrá“ znaková sada a porovnávání závisí na datech, která vaše databáze obsahuje – MySQL poskytuje některé dotazy, které vám pomohou rozhodnout, co použít, ale aby byly vaše znakové sady a porovnávání efektivní, měli byste také myslet o tom, kdy má smysl používat určité řazení a proč.