Om du någonsin har arbetat med MySQL har du oundvikligen stött på teckenuppsättningar och sammanställningar. I det här blogginlägget kommer vi att försöka ge dig en mer djupgående titt på vad dessa två är och hur du bör använda dem.
Vad är teckenuppsättningar och sorteringar?
Enkelt uttryckt är teckenuppsättningar i MySQL uppsättningar av symboler och kodningar - sammanställningar är uppsättningar av regler för att jämföra tecken i en teckenuppsättning. Med andra ord, teckenuppsättningar är uppsättningar av tecken som är lagliga i en sträng, medan sammanställningar är en uppsättning regler som används för att jämföra tecken i en viss teckenuppsättning. Precis hur varje teckenuppsättning har en standardsortering, kan teckenuppsättningar också ha flera sorteringar. MySQL har en standardteckenuppsättning och sortering för servern och för varje databas och tabell också.
Teckenuppsättningar i MySQL
I allmänhet fungerar teckenuppsättningar i MySQL så här:
- När en databas skapas härleds teckenuppsättningar från den serveromfattande variabeln character_set_server.
- När en tabell skapas härleds teckenuppsättningar från databasen.
- När en kolumn skapas härleds teckenuppsättningar från tabellen.
När det gäller teckenuppsättningar finns det några variabler du bör hålla ett öga på:
- Character_set_client definierar teckenuppsättningen i vilken uttalanden skickas av klienten.
- Character_set_connection definierar teckenuppsättningen som satser översätts till efter att en server tar emot en sats från klienten.
- Character_set_results definierar teckenuppsättningen i vilken servern returnerar frågeresultat till klienten.
Dessa tre inställningar kan ändras genom att använda SET NAMES eller SET CHARACTER SET-satserna, eller till och med i MySQL-konfigurationsfilerna.
När du hanterar teckenuppsättningar kan du ibland också stöta på ett fel #1267:
ERROR 1267 (HY000): Illegal mix of collations.
Ovanstående fel orsakas i allmänhet av att man jämför två strängar som har inkompatibla sorteringar eller genom att man försöker välja data som har en annan sortering till en kombinerad kolumn. Felet visas eftersom när MySQL jämför två värden med olika teckenuppsättningar måste den konvertera dem till samma teckenuppsättning för jämförelsen, men teckenuppsättningarna är inte kompatibla. För att lösa detta problem, se till att sammanställningarna för varje tabell och deras kolumner är desamma.
Samställningar i MySQL
Som redan nämnts ovan är sammanställningar nära besläktade med teckenuppsättningar eftersom en sammanställning är en uppsättning regler som definierar hur man jämför och sorterar teckensträngar. Varje teckenuppsättning har minst en sortering, vissa har också fler.
Även om vi inte kommer att gå in på de snåriga detaljerna om alla saker som sammanställs i MySQL i det här blogginlägget, finns det några saker du bör veta:
- Om du använder MySQL 5.7 är standard MySQL-sorteringen i allmänhet latin1_swedish_ci eftersom MySQL använder latin1 som standardteckenuppsättning. Om du använder MySQL 8.0 är standardteckenuppsättningen utf8mb4.
- Om du väljer att använda UTF-8 som din samling, använd alltid utf8mb4 (särskilt utf8mb4_unicode_ci). Du bör inte använda UTF-8 eftersom MySQL:s UTF-8 skiljer sig från korrekt UTF-8-kodning. Detta är fallet eftersom det inte erbjuder fullt unicode-stöd vilket kan leda till dataförlust eller säkerhetsproblem. Tänk på att utf8mb4_general_ci är en förenklad uppsättning sorteringsregler som tar genvägar utformade för att förbättra hastigheten medan utf8mb4_unicode_ci sorterar exakt på ett stort antal språk. I allmänhet är utf8mb4 den "säkraste" teckenuppsättningen eftersom den också stöder 4-byte unicode medan utf8 bara stöder upp till 3.
Välja en bra teckenuppsättning och sortering
För att välja en bra sortering och teckenuppsättning för din MySQL-datauppsättning, kom ihåg att hålla det enkelt. En blandning av olika teckenuppsättningar och (eller) sammanställningar kan vara en riktig röra eftersom de kan vara mycket förvirrande (till exempel kan allt fungera bra tills vissa karaktärer dyker upp, etc.) så det är bäst att utvärdera dina behov i förväg och välja det bästa sortering och teckenuppsättning i förväg. MySQL har också några värdefulla frågor som kan hjälpa dig att göra just det, till exempel
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
skulle returnera en lista över teckenuppsättningar och tillgängliga sorteringar tillsammans med deras beskrivning, vilket kan vara extremt användbart om du planerar din databasdesign.
Tänk på att vissa teckenuppsättningar kan kräva fler CPU-operationer, även att de kan förbruka mer lagringsutrymme. Att använda fel teckenuppsättningar kan till och med besegra indexering - till exempel måste MySQL konvertera teckenuppsättningar så att den kan jämföra dem när de inte är samma:konverteringen kan göra det omöjligt att använda ett index.
Tänk också på att vissa människor rekommenderar "att bara använda UTF-8 globalt" - detta kanske inte nödvändigtvis är en bra idé eftersom många applikationer inte ens behöver UTF-8 alls och, beroende på på dina data kan UTF-8 orsaka mer problem än det är värt (till exempel kan det använda mycket mer lagringsutrymme på disken), så välj klokt.
Sammanfattning
Karaktärsuppsättningar och kollationer kan vara dina vänner eller en av dina mardrömmar - allt beror på hur du använder dem. Tänk generellt på att en "bra" teckenuppsättning och sortering beror på den data som din databas innehåller - MySQL tillhandahåller vissa frågor som hjälper dig att bestämma vad du ska använda, men för att dina teckenuppsättningar och sammanställningar ska vara effektiva bör du också tänka på om när det är vettigt att använda en viss sammanställning och varför.