sql >> Database teknologi >  >> RDS >> Mysql

Forståelse af tegnsæt og samlinger i MySQL

Hvis du nogensinde har arbejdet med MySQL, stødte du uundgåeligt på tegnsæt og sammenstillinger. I dette blogindlæg vil vi forsøge at give dig et mere dybdegående kig på, hvad de to er, og hvordan du skal bruge dem.

Hvad er tegnsæt og sorteringer?

Simpelt sagt, tegnsæt i MySQL er sæt af symboler og kodninger - kollationer er sæt regler for sammenligning af tegn i et tegnsæt. Med andre ord er tegnsæt sæt af tegn, der er lovlige i en streng, mens kollationer er et sæt regler, der bruges til at sammenligne tegn i et bestemt tegnsæt. Ligesom hvert tegnsæt har en standardsortering, kan tegnsæt også have flere sorteringer. MySQL har et standardtegnsæt og sortering for serveren og også for hver database og tabel.

Tegnsæt i MySQL

Generelt fungerer tegnsæt i MySQL således:

  • Når en database oprettes, afledes tegnsæt fra den server-dækkende character_set_server-variabel.
  • Når en tabel oprettes, udledes tegnsæt fra databasen.
  • Når en kolonne oprettes, udledes tegnsæt fra tabellen.

Hvad angår tegnsæt, er der et par variabler, du bør holde øje med:

  • Character_set_client definerer det tegnsæt, hvori udsagn sendes af klienten.
  • Character_set_connection definerer det tegnsæt, som sætninger oversættes til, efter at en server modtager en erklæring fra klienten.
  • Character_set_results definerer det tegnsæt, hvori serveren returnerer forespørgselsresultater til klienten.

Disse tre indstillinger kan ændres ved at bruge SET NAMES eller SET CHARACTER SET-sætningerne eller endda i MySQL-konfigurationsfilerne.

Når du beskæftiger dig med tegnsæt nogle gange kan du også støde på en fejl #1267:

ERROR 1267 (HY000): Illegal mix of collations.

Ovenstående fejl er generelt forårsaget af sammenligning af to strenge, der har inkompatible sorteringer, eller ved at forsøge at vælge data, der har en anden sortering i en kombineret kolonne. Fejlen vises, fordi når MySQL sammenligner to værdier med forskellige tegnsæt, skal den konvertere dem til det samme tegnsæt til sammenligningen, men tegnsættene er ikke kompatible. For at løse dette problem skal du sikre dig, at sammenstillingerne af hver tabel og deres kolonner er de samme.

Samlinger i MySQL

Som allerede nævnt ovenfor, er sorteringer tæt forbundet med tegnsæt, fordi en sortering er et sæt regler, der definerer, hvordan man sammenligner og sorterer tegnstrenge. Hvert tegnsæt har mindst én sortering, nogle har også flere.

Selv om vi ikke vil gå ind i de små, grove detaljer om alle de ting, der er relateret til sortering i MySQL i dette blogindlæg, er der nogle ting, du bør vide:

  • Hvis du bruger MySQL 5.7, er standard MySQL-sorteringen generelt latin1_swedish_ci, fordi MySQL bruger latin1 som standardtegnsæt. Hvis du bruger MySQL 8.0, er standardtegnsættet utf8mb4.
  • Hvis du vælger at bruge UTF-8 som din samling, skal du altid bruge utf8mb4 (specifikt utf8mb4_unicode_ci). Du bør ikke bruge UTF-8, fordi MySQL's UTF-8 er forskellig fra korrekt UTF-8-kodning. Dette er tilfældet, fordi det ikke tilbyder fuld unicode-understøttelse, hvilket kan føre til datatab eller sikkerhedsproblemer. Husk på, at utf8mb4_general_ci er et forenklet sæt af sorteringsregler, som tager genveje designet til at forbedre hastigheden, mens utf8mb4_unicode_ci sorterer præcist på en lang række sprog. Generelt er utf8mb4 det "sikreste" tegnsæt, da det også understøtter 4-byte unicode, mens utf8 kun understøtter op til 3.

Valg af et godt tegnsæt og sortering

For at vælge en god sortering og tegnsæt til dit MySQL-datasæt, husk at holde det enkelt. En blanding af forskellige tegnsæt og (eller) sammenstillinger kan være et rigtigt rod, da de kan være meget forvirrende (for eksempel kan alt fungere fint, indtil visse karakterer dukker op osv.), så det er bedst at vurdere dine behov på forhånd og vælge det bedste sortering og tegnsæt på forhånd. MySQL har også et par værdifulde forespørgsler, der kan hjælpe dig med at gøre netop det, f.eks. 

SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;

ville returnere en liste over tegnsæt og tilgængelige sorteringer sammen med deres beskrivelse, hvilket kan være yderst nyttigt, hvis du planlægger dit databasedesign.

Husk på, at nogle tegnsæt kan kræve flere CPU-operationer, og de kan også optage mere lagerplads. Brug af forkerte tegnsæt kan endda besejre indeksering - for eksempel er MySQL nødt til at konvertere tegnsæt, så det kan sammenligne dem, når de ikke er ens:konverteringen kan gøre det umuligt at bruge et indeks.

Husk også på, at nogle mennesker anbefaler "at bare bruge UTF-8 globalt" - dette er måske ikke nødvendigvis en god idé, fordi mange applikationer slet ikke har brug for UTF-8, og afhængigt af på dine data kan UTF-8 forårsage flere problemer, end det er værd (f.eks. kan det bruge meget mere lagerplads på disken), så vælg med omhu.

Oversigt

Karaktersæt og kollationer kan være dine venner eller et af dine mareridt – det hele afhænger af, hvordan du bruger dem. Generelt skal du huske på, at et "godt" tegnsæt og sortering afhænger af de data, din database indeholder - MySQL giver nogle forespørgsler for at hjælpe dig med at beslutte, hvad du skal bruge, men for at dine tegnsæt og sammenstillinger skal være effektive, bør du også tænke om hvornår det giver mening at bruge en bestemt sammenstilling og hvorfor.


  1. Sammenlign fire førende database-IDE-værktøjer

  2. Hvad er ODBC?

  3. Tilføj en databasemailkonto til en profil (T-SQL)

  4. SQRT() Eksempler i SQL Server