sql >> Database >  >> RDS >> Mysql

Wat is het verschil tussen utf8_general_ci en utf8_unicode_ci?

Voor degenen die in 2020 of later nog steeds bij deze vraag aankomen, zijn er nieuwere opties die mogelijk beter zijn dan beide van deze. Bijvoorbeeld utf8mb4_0900_ai_ci .

Al deze sorteringen zijn voor de UTF-8-tekencodering. De verschillen zitten in de manier waarop tekst wordt gesorteerd en vergeleken.

_unicode_ci en _general_ci zijn twee verschillende sets regels voor het sorteren en vergelijken van tekst op de manier die we verwachten. Nieuwere versies van MySQL introduceren ook nieuwe sets regels, zoals _0900_ai_ci voor gelijkwaardige regels gebaseerd op Unicode 9.0 - en zonder gelijkwaardige _general_ci variant. Mensen die dit nu lezen, zouden waarschijnlijk een van deze nieuwere sorteringen moeten gebruiken in plaats van _unicode_ci of _general_ci . De beschrijving van die oudere sorteringen hieronder is alleen bedoeld voor interesse.

MySQL stapt momenteel over van een oudere, gebrekkige UTF-8-implementatie. Voor nu moet je utf8mb4 . gebruiken in plaats van utf8 voor het tekencoderingsgedeelte, om er zeker van te zijn dat u de vaste versie krijgt. De gebrekkige versie blijft voor achterwaartse compatibiliteit, hoewel deze wordt afgeschaft.

Belangrijke verschillen

  • utf8mb4_unicode_ci is gebaseerd op de officiële Unicode-regels voor universeel sorteren en vergelijken, die nauwkeurig sorteert in een groot aantal talen.

  • utf8mb4_general_ci is een vereenvoudigde set van sorteerregels die tot doel heeft zo goed mogelijk te presteren en tegelijkertijd veel kortere wegen te nemen die zijn ontworpen om de snelheid te verbeteren. Het volgt de Unicode-regels niet en zal in sommige situaties leiden tot ongewenste sortering of vergelijking, zoals bij het gebruik van bepaalde talen of tekens.

    Op moderne servers zal deze prestatieverbetering zo goed als te verwaarlozen zijn. Het is bedacht in een tijd dat servers maar een fractie van de CPU-prestaties van de huidige computers hadden.

Voordelen van utf8mb4_unicode_ci over utf8mb4_general_ci

utf8mb4_unicode_ci , dat de Unicode-regels gebruikt voor sorteren en vergelijken, maakt gebruik van een vrij complex algoritme voor correct sorteren in een groot aantal talen en bij gebruik van een groot aantal speciale tekens. Deze regels moeten rekening houden met taalspecifieke conventies; niet iedereen sorteert zijn karakters in wat we 'alfabetische volgorde' zouden noemen.

Wat de Latijnse (dwz "Europese") talen betreft, is er niet veel verschil tussen de Unicode-sortering en de vereenvoudigde utf8mb4_general_ci sorteren in MySQL, maar er zijn nog een paar verschillen:

  • De Unicode-sortering sorteert bijvoorbeeld "ß" zoals "ss" en "Œ" zoals "OE" zoals mensen die deze tekens gebruiken normaal gesproken zouden willen, terwijl utf8mb4_general_ci sorteert ze als afzonderlijke tekens (vermoedelijk zoals respectievelijk "s" en "e").

  • Sommige Unicode-tekens zijn gedefinieerd als te negeren, wat betekent dat ze niet moeten meetellen voor de sorteervolgorde en dat de vergelijking moet doorgaan naar het volgende teken. utf8mb4_unicode_ci behandelt deze correct.

In niet-Latijnse talen, zoals Aziatische talen of talen met verschillende alfabetten, kan er veel meer zijn verschillen tussen Unicode-sortering en de vereenvoudigde utf8mb4_general_ci sorteren. De geschiktheid van utf8mb4_general_ci zal sterk afhangen van de gebruikte taal. Voor sommige talen zal het behoorlijk ontoereikend zijn.

Wat moet je gebruiken?

Er is vrijwel zeker geen reden om utf8mb4_general_ci te gebruiken niet meer, omdat we het punt achter ons hebben gelaten waar de CPU-snelheid laag genoeg is dat het prestatieverschil belangrijk zou zijn. Uw database zal vrijwel zeker worden beperkt door andere knelpunten dan deze.

In het verleden adviseerden sommige mensen om utf8mb4_general_ci . te gebruiken behalve wanneer nauwkeurig sorteren belangrijk genoeg zou zijn om de prestatiekosten te rechtvaardigen. Tegenwoordig zijn die prestatiekosten zo goed als verdwenen, en ontwikkelaars gaan internationalisering serieuzer aan.

Er moet een argument worden aangevoerd dat als snelheid voor u belangrijker is dan nauwkeurigheid, u net zo goed helemaal niet kunt sorteren. Het is triviaal om een ​​algoritme sneller te maken als je het niet nodig hebt om nauwkeurig te zijn. Dus, utf8mb4_general_ci is een compromis dat waarschijnlijk niet nodig is om snelheidsredenen en waarschijnlijk ook niet geschikt is om redenen van nauwkeurigheid.

Een ander ding dat ik zal toevoegen is dat zelfs als je weet dat je applicatie alleen de Engelse taal ondersteunt, het nog steeds te maken kan hebben met de namen van mensen, die vaak tekens kunnen bevatten die worden gebruikt in andere talen waarin het net zo belangrijk is om correct te sorteren . Het gebruik van de Unicode-regels voor alles helpt om gemoedsrust te geven dat de zeer slimme Unicode-mensen heel hard hebben gewerkt om het sorteren goed te laten werken.

Wat de onderdelen betekenen

Ten eerste, ci is voor hoofdlettergevoelig sorteren en vergelijken. Dit betekent dat het geschikt is voor tekstuele gegevens en dat hoofdletters niet belangrijk zijn. De andere soorten sortering zijn cs (hoofdlettergevoelig) voor tekstuele gegevens waarbij hoofdletters belangrijk zijn, en bin , voor waar de codering moet overeenkomen, bit voor bit, wat geschikt is voor velden die echt gecodeerde binaire gegevens zijn (inclusief bijvoorbeeld Base64). Hoofdlettergevoelig sorteren leidt tot rare resultaten en hoofdlettergevoelige vergelijking kan resulteren in dubbele waarden die alleen verschillen in hoofdletters, dus hoofdlettergevoelige sorteringen vallen uit de gratie voor tekstuele gegevens - als hoofdletters voor u belangrijk zijn, dan zijn anders onaanvaardbare interpunctie enzovoort is waarschijnlijk ook significant, en een binaire sortering is misschien meer geschikt.

Vervolgens unicode of general verwijst naar de specifieke sorteer- en vergelijkingsregels - in het bijzonder de manier waarop tekst wordt genormaliseerd of vergeleken. Er zijn veel verschillende sets regels voor de utf8mb4-tekencodering, met unicode en general zijn twee die proberen goed te werken in alle mogelijke talen in plaats van één specifieke. De verschillen tussen deze twee sets regels zijn het onderwerp van dit antwoord. Merk op dat unicode gebruikt regels van Unicode 4.0. Recente versies van MySQL voegen de regelsets toe unicode_520 met behulp van regels van Unicode 5.2 en 0900 (het gedeelte "unicode_" laten vallen) met behulp van regels van Unicode 9.0.

En tot slot, utf8mb4 is natuurlijk de karaktercodering die intern wordt gebruikt. In dit antwoord heb ik het alleen over op Unicode gebaseerde coderingen.



  1. verleen externe toegang tot de MySQL-database vanaf elk IP-adres

  2. Controleer of er een tabel bestaat in Oracle

  3. DBaaS, cloud en transparante queryrouting

  4. FORMAT() is leuk en zo, maar...