utf8_general_ci
je velmi jednoduché – a v Unicode velmi nefunkční – řazení, které poskytuje nesprávné výsledky na obecný text Unicode. Co to dělá je:
- převede na normalizační formu D Unicode pro kanonickou dekompozici
- odstraní všechny kombinující znaky
- převede na velká písmena
Toto nefunguje správně na Unicode, protože nerozumí psaní velkých a malých písmen Unicode. Samotné zapouzdření Unicode je mnohem komplikovanější, než dokáže přístup zaměřený na ASCII zvládnout. Například:
- Malé písmeno „ẞ“ je „ß“, ale velké písmeno „ß“ je „SS“.
- Existují dvě malá řecká sigma, ale pouze jedno velké; zvažte „Σίσυφος“.
- Písmena jako „ø“ se nerozkládají na „o“ plus diakritické znaménko, což znamená, že nebudou správně řazena.
Existuje mnoho dalších jemností.
utf8_unicode_ci
používá standardní Unicode Collation Algorithm , podporuje tzv. expanze a ligatury, například:Německé písmeno ß (U+00DF PÍSMENO SHARP S) je seřazeno blízko "ss" Písmeno Œ (U+0152 LATIN CAPITAL LIGATURE OE) je seřazeno blízko "OE".
utf8_general_ci
nepodporuje rozšíření/ligatury, třídí všechna tato písmena jako jednotlivé znaky a někdy ve špatném pořadí.
utf8_unicode_ci
je obecně přesnější pro všechny skripty. Například na bloku azbuky:utf8_unicode_ci
je v pořádku pro všechny tyto jazyky:ruština, bulharština, běloruština, makedonština, srbština a ukrajinština. Zatímco utf8_general_ci je v pořádku pouze pro ruskou a bulharskou podmnožinu cyrilice. Další písmena použitá v běloruštině, makedonštině, srbštině a ukrajinštině nejsou dobře tříděna.
Cena utf8_unicode_ci
je, že je to trochu o bit pomalejší než utf8_general_ci
. Ale to je cena, kterou platíte za správnost. Buď můžete mít rychlou odpověď, která je špatná, nebo velmi mírně pomalejší odpověď, která je správná. Vaše volba. Je velmi obtížné někdy ospravedlnit špatné odpovědi, takže je nejlepší předpokládat, že utf8_general_ci
neexistuje a vždy použijte utf8_unicode_ci
. Tedy, pokud nechcete špatné odpovědi.
Zdroj:http://forums.mysql.com/read .php?103,187048,188748#msg-188748