2011-04-02 16 views

risposta

21

Come il set di caratteri, se è possibile, sicuramente UTF-8.

Come la raccolta - questo è un po 'brutto per le lingue con caratteri speciali. Esistono vari tipi di regole di confronto. Tutti possono memorizzare tutte le dieresi e altri personaggi, ma differiscono nel modo in cui trattano dieresi nei confronti, vale a dire se

u = ü 

è vero o falso; e nell'ordinamento (dove negli alfabeti gli Umlaut si trovano nell'ordine di ordinamento).

Per farla breve, la cosa migliore è sia

utf8_unicode_ci

Permette di caso Ricerche insensitive; Tratta ß come ss e utilizza l'ordinamento DIN-1. Purtroppo, come tutte le regole di confronto Unicode non binari, tratta lo u = ü che è un terribile fastidio perché la ricerca di "Muller" restituirà anche "Müller". Dovrai ovviare a questo impostando una collazione basata su Umlaut in tempo reale.

o utf8_bin

Questa raccolta non si ha il problema u = ü ma solo caso le ricerche sensibili sono possibili.

Non sono completamente sicuro se ci sono altri effetti collaterali sull'uso della collazione binaria; Ho fatto una domanda su questo here.


This mySQL manual page dà una buona panoramica sulle varie regole di confronto e le conseguenze che ne derivano in uso quotidiano.

Here è una panoramica generale sulle regole di confronto disponibili in MySQL.

+0

So che questo è super vecchio, ma ... Sto cercando di applicare una collazione utf8 simile a quello che hai sopra. Tuttavia, quando si utilizza utf8_unicode_ci il carattere 'é' viene codificato in '?'. Hai qualche idea del perché? Pensavo che utf8 avesse una rappresentazione per ogni personaggio. – wright8191

+0

@Pekka, poiché 'utf8' è imperfetto (non vero unicode), perché lo raccomandi su' utf8mb4'? – Pacerier

3

utf-8-general-ci o utf-8-unicode-ci.

conoscere la differenza: UTF-8: General? Bin? Unicode?

+3

Penso che tu intenda "utf8_general_ci' o" utf8_unicode_ci'. –

2

Per sostenere la completa UTF-8 di serie si deve utilizzare il set di caratteri utf8mb4 e le regole di confronto utf8mb4_unicode_ci in MySQL!

Nota: MySQL supporta solo caratteri da 1 a 3 byte quando si utilizza il cosiddetto set di caratteri utf8! Questo è il motivo per cui i moderni Emojis non sono supportati in quanto utilizzano 4 byte!

L'unico modo per supportare pienamente lo standard UTF-8 è quello di cambiare il set di caratteri e collazione di TUTTI tavoli e del banca dati stesso per utf8mb4 e utf8mb4_unicode_ci. Inoltre, la connessione del database deve utilizzare anche utf8mb4.

Il server MySQL deve utilizzare utf8mb4 come set di caratteri di default che può essere configurato manualmente nella /etc/mysql/conf.d/mysql.cnf

[client] 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4 

[mysqld] 
# character-set-client-handshake = FALSE ## better not set this! 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

tabelle esistenti possono essere migrati utf8mb4 utilizzando la seguente istruzione SQL :

ALTER TABLE <table-name> CONVERT TO 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci; 

Nota:

  • Per assicurarsi che tutte le giunzioni tra tavolo-colonne non saranno rallentato dalle codifiche charset TUTTE le tabelle devono essere cambiate!
  • Poiché la lunghezza di un indice è limitato in MySQL, il numero totale di caratteri per indice di riga devono essere moltiplicati per 4 byte e devono essere inferiori a 3072

Quando l'opzione di configurazione innodb_large_prefix è abilitato, questo limite di lunghezza viene aumentato a 3072 byte, per le tabelle InnoDB che utilizzano i formati di riga DYNAMIC e COMPRESSED.

Per cambiare il set di caratteri e confronto predefinito della base di dati, eseguire questo comando:

ALTER DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

Dal utf8mb4 è completamente compatibile con utf8, dovrebbe avvenire senza mojibake o altre forme di perdita di dati.

Problemi correlati