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

Quali sono le differenze tra utf8_general_ci e utf8_unicode_ci?

utf8_general_ci è un confronto molto semplice e, su Unicode, molto frammentato, che dà risultati errati sul testo Unicode generale. Quello che fa è:

  • converte in formato D di normalizzazione Unicode per la scomposizione canonica
  • rimuove tutti i caratteri combinati
  • converte in maiuscolo

Questo non funziona correttamente su Unicode, perché non comprende il case Unicode. Il solo case Unicode è molto più complicato di quanto possa gestire un approccio orientato all'ASCII. Ad esempio:

  • Il minuscolo di "ẞ" è "ß", ma il maiuscolo di "ß" è "SS".
  • Ci sono due sigma greci minuscoli, ma solo uno maiuscolo; considera “Σίσυφος”.
  • Lettere come "ø" non si decompongono in una "o" più un segno diacritico, il che significa che non verranno ordinate correttamente.

Ci sono molte altre sottigliezze.

  1. utf8_unicode_ci utilizza lo standard Algoritmo di confronto Unicode , supporta le cosiddette espansioni e legature, ad esempio:la lettera tedesca ß (U+00DF LETTER SHARP S) è ordinata vicino a "ss" La lettera Œ (U+0152 LATIN CAPITAL LIGATURE OE) è ordinata vicino a "OE".

utf8_general_ci non supporta espansioni/legature, ordina tutte queste lettere come singoli caratteri e talvolta in un ordine errato.

  1. utf8_unicode_ci è generalmente più accurato per tutti gli script. Ad esempio, sul blocco cirillico:utf8_unicode_ci va bene per tutte queste lingue:russo, bulgaro, bielorusso, macedone, serbo e ucraino. Mentre utf8_general_ci va bene solo per il sottoinsieme russo e bulgaro del cirillico. Le lettere extra usate in bielorusso, macedone, serbo e ucraino non sono ordinate bene.

Il costo di utf8_unicode_ci è che è un poco bit più lento di utf8_general_ci . Ma questo è il prezzo da pagare per la correttezza. O puoi avere una risposta veloce che è sbagliata, o una risposta leggermente più lenta che è giusta. La tua scelta. È molto difficile giustificare mai dare risposte sbagliate, quindi è meglio presumere che utf8_general_ci non esiste e utilizzare sempre utf8_unicode_ci . Bene, a meno che tu non voglia risposte sbagliate.

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