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

Hvad er forskellene mellem utf8_general_ci og utf8_unicode_ci?

utf8_general_ci er en meget enkel — og på Unicode, meget ødelagt — sortering, der giver forkerte resultater om generel Unicode-tekst. Hvad den gør er:

  • konverterer til Unicode-normaliseringsform D for kanonisk dekomponering
  • fjerner alle kombinationstegn
  • konverterer til store bogstaver

Dette fungerer ikke korrekt på Unicode, fordi det ikke forstår Unicode-hus. Unicode-casing alene er meget mere kompliceret, end en ASCII-minded tilgang kan håndtere. For eksempel:

  • Små bogstaver i "ẞ" er "ß", men store bogstaver af "ß" er "SS".
  • Der er to græske sigmaer med små bogstaver, men kun et stort bogstav; overveje "Σίσυφος".
  • Bogstaver som "ø" nedbrydes ikke til et "o" plus en diakritisk, hvilket betyder, at det ikke sorteres korrekt.

Der er mange andre finesser.

  1. utf8_unicode_ci bruger standarden Unicode Collation Algorithm , understøtter såkaldte udvidelser og ligaturer, for eksempel:Det tyske bogstav ß (U+00DF LETTER SHARP S) er sorteret i nærheden af ​​"ss"Letter Œ (U+0152 LATIN CAPITAL LIGATURE OE) er sorteret i nærheden af ​​"OE".

utf8_general_ci understøtter ikke udvidelser/ligaturer, den sorterer alle disse bogstaver som enkelte tegn og nogle gange i en forkert rækkefølge.

  1. utf8_unicode_ci er generelt mere nøjagtig for alle scripts. For eksempel på kyrillisk blok:utf8_unicode_ci er fint til alle disse sprog:russisk, bulgarsk, hviderussisk, makedonsk, serbisk og ukrainsk. Mens utf8_general_ci kun er fint til russisk og bulgarsk undergruppe af kyrillisk. Ekstra bogstaver brugt på hviderussisk, makedonsk, serbisk og ukrainsk er ikke sorteret godt.

Prisen for utf8_unicode_ci er, at det er en lille bit langsommere end utf8_general_ci . Men det er prisen, du betaler for korrekthed. Enten kan du få et hurtigt svar, der er forkert, eller et meget lidt langsommere svar, der er rigtigt. Dit valg. Det er meget svært nogensinde at retfærdiggøre at give forkerte svar, så det er bedst at antage, at utf8_general_ci eksisterer ikke og altid at bruge utf8_unicode_ci . Medmindre du vil have forkerte svar.

Kilde:http://forums.mysql.com/read .php?103,187048,188748#msg-188748



  1. SQL Server XML-forespørgsel med flere navnerum

  2. Er det muligt at gemme værdien af ​​en udvalgt kolonne og bruge den til den næste?

  3. SQLServer IDENTITY Kolonne med tekst

  4. Sådan opretter du en tabel i SQL Server ved hjælp af en forespørgsel