sql >> Databasteknik >  >> RDS >> Mysql

Vilka är skillnaderna mellan utf8_general_ci och utf8_unicode_ci?

utf8_general_ci är en mycket enkel – och på Unicode, väldigt trasig – sammanställning, en som ger felaktiga resultat på allmän Unicode-text. Vad den gör är:

  • konverterar till Unicode-normaliseringsform D för kanonisk nedbrytning
  • tar bort alla kombinationstecken
  • konverterar till versaler

Detta fungerar inte korrekt på Unicode, eftersom det inte förstår Unicode-skal. Enbart Unicode-hölje är mycket mer komplicerat än ett ASCII-inriktat tillvägagångssätt kan hantera. Till exempel:

  • Små bokstäver i "ẞ" är "ß", men versalerna i "ß" är "SS".
  • Det finns två grekiska sigma med små bokstäver, men bara en versal; överväga "Σίσυφος".
  • Bokstäver som "ø" bryts inte ner till ett "o" plus en diakritisk, vilket betyder att de inte kommer att sorteras korrekt.

Det finns många andra finesser.

  1. utf8_unicode_ci använder standarden Unicode Collation Algorithm , stöder så kallade expansioner och ligaturer, till exempel:den tyska bokstaven ß (U+00DF LETTER SHARP S) är sorterad nära "ss" Bokstaven Œ (U+0152 LATIN CAPITAL LIGATURE OE) är sorterad nära "OE".

utf8_general_ci stöder inte expansioner/ligaturer, den sorterar alla dessa bokstäver som enstaka tecken, och ibland i fel ordning.

  1. utf8_unicode_ci är allmänt mer exakt för alla skript. Till exempel på kyrilliskt block:utf8_unicode_ci är bra för alla dessa språk:ryska, bulgariska, vitryska, makedonska, serbiska och ukrainska. Medan utf8_general_ci bara är bra för ryska och bulgariska delmängder av kyrilliska. Extra bokstäver som används på vitryska, makedonska, serbiska och ukrainska är inte bra sorterade.

Kostnaden för utf8_unicode_ci är att det är en liten bitslower än utf8_general_ci . Men det är priset du betalar för korrekthet. Antingen kan du ha ett snabbt svar som är fel, eller ett mycket lite långsammare svar som är rätt. Ditt val. Det är mycket svårt att någonsin motivera att ge felaktiga svar, så det är bäst att anta att utf8_general_ci existerar inte och att alltid använda utf8_unicode_ci . Tja, om du inte vill ha fel svar.

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



  1. Oracle DB Server + APEX + ORDS + JasperReports from scratch (Del 4)

  2. Exportera SQLite-databas till XML-fil

  3. Hur man skapar en främmande nyckel i SQL Server (T-SQL-exempel)

  4. Hur bearbetar MySQL ORDER BY och LIMIT i en fråga?