sql >> Database >  >> RDS >> Mysql

Tekensets en sorteringen in MySQL begrijpen

Als je ooit met MySQL hebt gewerkt, kwam je onvermijdelijk tekensets en sorteringen tegen. In deze blogpost proberen we je een meer diepgaand inzicht te geven in wat die twee zijn en hoe je ze moet gebruiken.

Wat zijn tekensets en -sorteringen?

Simpel gezegd, tekensets in MySQL zijn sets symbolen en coderingen - collaties zijn sets regels voor het vergelijken van tekens in een tekenset. Met andere woorden, tekensets zijn reeksen tekens die legaal zijn in een tekenreeks, terwijl sorteringen een reeks regels zijn die worden gebruikt om tekens in een bepaalde tekenreeks te vergelijken. Net zoals elke tekenset een standaardsortering heeft, kunnen tekensets ook verschillende sorteringen hebben. MySQL heeft een standaard tekenset en sortering voor de server en ook voor elke database en tabel.

Tekensets in MySQL

Over het algemeen werken tekensets in MySQL als volgt:

  • Als een database wordt gemaakt, worden tekensets afgeleid van de serverbrede variabele character_set_server.
  • Als een tabel wordt gemaakt, worden tekensets uit de database afgeleid.
  • Als een kolom wordt gemaakt, worden tekensets afgeleid van de tabel.

Wat tekensets betreft, zijn er een paar variabelen die u in de gaten moet houden:

  • Character_set_client definieert de tekenset waarin instructies door de klant worden verzonden.
  • Character_set_connection definieert de tekenset waarin instructies worden vertaald nadat een server een instructie van de client heeft ontvangen.
  • Character_set_results definieert de tekenset waarin de server de queryresultaten terugstuurt naar de client.

Deze drie instellingen kunnen worden gewijzigd met behulp van de instructies SET NAMES of SET CHARACTER SET, of zelfs in de MySQL-configuratiebestanden.

Als je te maken hebt met tekensets, kun je soms ook een fout #1267 tegenkomen:

ERROR 1267 (HY000): Illegal mix of collations.

De bovenstaande fout wordt meestal veroorzaakt door het vergelijken van twee tekenreeksen met incompatibele sorteringen of door te proberen gegevens met een andere sortering in een gecombineerde kolom te selecteren. De fout wordt weergegeven omdat wanneer MySQL twee waarden met verschillende tekensets vergelijkt, deze voor de vergelijking naar dezelfde tekenset moet worden geconverteerd, maar de tekensets zijn niet compatibel. Om dit probleem op te lossen, moet u ervoor zorgen dat de sorteringen van elke tabel en hun kolommen hetzelfde zijn.

Collaties in MySQL

Zoals hierboven al vermeld, zijn sorteringen nauw verwant aan tekensets, omdat een sortering een reeks regels is die bepaalt hoe tekenreeksen moeten worden vergeleken en gesorteerd. Elke tekenset heeft ten minste één sortering, sommige hebben er ook meer.

Hoewel we in deze blogpost niet ingaan op de details van alle zaken die verband houden met het sorteren in MySQL, zijn er enkele dingen die u moet weten:

  • Als je MySQL 5.7 gebruikt, is de standaard MySQL-sortering over het algemeen latin1_swedish_ci omdat MySQL latin1 als standaardtekenset gebruikt. Als u MySQL 8.0 gebruikt, is de standaardtekenset utf8mb4.
  • Als je ervoor kiest om UTF-8 als sortering te gebruiken, gebruik dan altijd utf8mb4 (met name utf8mb4_unicode_ci). U moet geen UTF-8 gebruiken omdat MySQL's UTF-8 verschilt van de juiste UTF-8-codering. Dit is het geval omdat het geen volledige Unicode-ondersteuning biedt, wat kan leiden tot gegevensverlies of beveiligingsproblemen. Houd er rekening mee dat utf8mb4_general_ci een vereenvoudigde set sorteerregels is die snelkoppelingen gebruikt die zijn ontworpen om de snelheid te verbeteren, terwijl utf8mb4_unicode_ci nauwkeurig sorteert in een groot aantal talen. Over het algemeen is utf8mb4 de "veiligste" tekenset omdat het ook 4-byte unicode ondersteunt, terwijl utf8 er maximaal 3 ondersteunt.

Een goede tekenset en sortering kiezen

Als u een goede sortering en tekenset voor uw MySQL-gegevensset wilt kiezen, moet u deze eenvoudig houden. Een mix van verschillende tekensets en (of) sorteringen kan een echte puinhoop zijn, omdat ze erg verwarrend kunnen zijn (alles zou bijvoorbeeld goed kunnen werken totdat bepaalde tekens verschijnen, enz.), dus het is het beste om uw behoeften vooraf te evalueren en de beste te kiezen sortering en tekenset vooraf. MySQL heeft ook een aantal waardevolle zoekopdrachten die u daarbij kunnen helpen, bijvoorbeeld 

SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;

zou een lijst met tekensets en beschikbare sorteringen samen met hun beschrijving retourneren, wat erg handig kan zijn als u uw database-ontwerp plant.

Houd er rekening mee dat voor sommige tekensets mogelijk meer CPU-bewerkingen nodig zijn, en dat ze ook meer opslagruimte in beslag kunnen nemen. Het gebruik van verkeerde tekensets kan zelfs indexering teniet doen - MySQL moet bijvoorbeeld tekensets converteren zodat ze ze kunnen vergelijken wanneer ze niet hetzelfde zijn:de conversie kan het gebruik van een index onmogelijk maken.

Houd er ook rekening mee dat sommige mensen aanbevelen "om UTF-8 gewoon wereldwijd te gebruiken" - dit hoeft niet per se een geweldig idee te zijn, omdat veel applicaties UTF-8 helemaal niet nodig hebben en, afhankelijk van op uw gegevens kan UTF-8 meer problemen veroorzaken dan het waard is (het kan bijvoorbeeld veel meer opslagruimte op de schijf in beslag nemen), dus kies verstandig.

Samenvatting

Tekensets en verzamelingen kunnen je vrienden zijn of een van je nachtmerries - het hangt allemaal af van hoe je ze gebruikt. Houd er in het algemeen rekening mee dat een "goede" tekenset en sortering afhankelijk zijn van de gegevens die uw database bevat - MySQL biedt enkele vragen om u te helpen beslissen wat u wilt gebruiken, maar om uw tekensets en sortering effectief te laten zijn, moet u ook nadenken over wanneer het zinvol is om een ​​bepaalde sortering te gebruiken en waarom.


  1. Overwegingen met betrekking tot gegevensintegriteit en prestatie in semisynchrone MySQL-replicatie

  2. Wat is het effect van het plaatsen van de commit na DML in de procedure?

  3. RStudio verbinden met SQL Server

  4. Kan PostgreSQL matrixkolommen indexeren?