2009-06-24 3 views
75

Eventuali duplicati:
What's the difference between utf8_general_ci and utf8_unicode_ciQuali sono le diffrenze tra utf8_general_ci e utf8_unicode_ci?

ho due opzioni per Unicode che sembrano promettenti per un database mysql.

utf8_general_ci unicode (multilingual), case-insensitive 
utf8_unicode_ci unicode (multilingual), case-insensitive 

Si può spiegare che cosa è la differenza tra utf8_general_ci e utf8_unicode_ci? Quali sono gli effetti della scelta dell'uno sull'altra quando si progetta un database?

+0

Vedi anche http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci – unor

risposta

119

utf8_general_ci è molto semplice - e su Unicode, molto rotto - collazione, uno che dà risultati non corretti sul testo generale Unicode. Ciò che fa è:

  • converte in Unicode forma normalizzazione D per la decomposizione canonica
  • rimuove tutti i caratteri che conciliano
  • converte in maiuscolo

Questo non funziona correttamente su Unicode, perché non capisce l'involucro Unicode. L'involucro Unicode da solo è molto più complicato di un approccio di tipo ASCII in grado di gestire. Ad esempio:

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

Ci sono molte altre sottigliezze.

  1. utf8_unicode_ci utilizza lo standard Unicode Collation Algorithm, supporta i cosiddetti espansioni e legature, per esempio: lettera SS tedesche (U + 00DF LETTERA SHARP S) vengono ordinati nei pressi di "ss" Lettera Œ (U + 0152 LATIN CAPITAL LEGATURE OE) è ordinato vicino a "OE".

utf8_general_ci non supporta espansioni/legature, che smista tutte queste lettere come singoli caratteri, e, talvolta, in un ordine sbagliato.

  1. utf8_unicode_ci è generalmente più accurata per tutti gli script. Ad esempio, nel 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 supplementari utilizzate in bielorusso, macedone, serbo e ucraino non sono state selezionate correttamente.

Il costo di utf8_unicode_ci è che è un po po 'più lento di utf8_general_ci. Ma questo è il prezzo che si paga per la correttezza. O si può avere una risposta veloce che è sbagliata o una risposta leggermente più lenta che è giusta. La tua scelta. È molto difficile giustificare mai dare risposte errate, quindi è meglio supporre 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

+1

Bonus per l'elenco delle lingue – reconbot

+3

assomiglia questa risposta è stata copiata direttamente dal forum mysql http://forums.mysql.com/read.php?103,187048,188748#msg-188748 – Matt

+0

@Matt: beh, alcuni di noi cercano su google: P – Timotei

19

Da Unicode Character Sets nel MySQL documentation:

Per ogni set di caratteri Unicode, operazioni eseguite utilizzando le regole _general_ci sono più veloci rispetto a quelli per la _unicode_ci collazione. Ad esempio, i confronti per le regole di confronto utf8_general_ci sono più veloci, ma leggermente meno corrette, rispetto ai confronti per utf8_unicode_ci. La ragione di ciò è che utf8_unicode_ci supporta i mapping come le espansioni; cioè, quando un personaggio è paragonabile alle combinazioni di altri caratteri. Ad esempio, in tedesco e in altre lingue "ß" è uguale a "ss". utf8_unicode_ci supporta anche contrazioni e caratteri ignorabili. utf8_general_ci è un confronto esistente che non supporta espansioni, contrazioni o caratteri ignorabili. Può fare solo confronti uno-a-uno tra i personaggi.