Come fare in modo che MySQL gestisca correttamente UTF-8
Domanda
Una delle risposte a una domanda che ho posto ieri mi ha suggerito di assicurarmi che il mio database sia in grado di gestire correttamente i caratteri UTF-8. Come posso farlo con MySQL?
Soluzione
Aggiornamento:
Risposta breve - Dovresti quasi sempre utilizzare il utf8mb4
set di caratteri e utf8mb4_unicode_ci
regole di confronto.
Per modificare il database:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Vedi:
-
Il commento di Aaron su questa risposta Come fare MySQL gestisce UTF-8 correttamente
-
Guida alla conversione: https: // dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Risposta originale:
MySQL 4.1 e versioni successive hanno un set di caratteri predefinito UTF-8. Puoi verificarlo nel tuo my.cnf
file, ricordati di impostare sia client che server (default-character-set
e character-set-server
).
Se disponi di dati esistenti che desideri convertire in UTF-8, scarica il database e importalo nuovamente come UTF-8 assicurandoti:
- usa
SET NAMES utf8
prima di eseguire una query / inserimento nel database - usa
DEFAULT CHARSET=utf8
quando crei nuove tabelle - a questo punto il tuo client e server MySQL dovrebbe essere in UTF-8 (vedi <=>). ricorda che tutte le lingue che usi (come PHP) devono essere anche UTF-8. Alcune versioni di PHP useranno la propria libreria client MySQL, che potrebbe non essere a conoscenza di UTF-8.
Se vuoi migrare i dati esistenti ricordati di fare prima il backup! Un sacco di strane parti di dati possono accadere quando le cose non vanno come previsto!
Alcune risorse:
- migrazione UTF-8 completa (cdbaby.com)
- articolo su disponibilità UTF-8 delle funzioni php (notare alcune di queste le informazioni non sono aggiornate)
Altri suggerimenti
Per renderlo 'permanente', in my.cnf
:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
Per verificare, vai al client e mostra alcune variabili:
SHOW VARIABLES LIKE 'character_set%';
Verifica che siano tutti utf8
, tranne ..._filesystem
, che dovrebbero essere binary
e ..._dir
, che indicano un punto da qualche parte nell'installazione di MySQL.
MySQL 4.1 e versioni successive hanno un set di caratteri predefinito che chiama utf8
ma che in realtà è solo un sottoinsieme di UTF-8 (consente solo caratteri a tre byte e più piccoli).
Usa utf8mb4
come set di caratteri se vuoi " full " UTF-8.
La risposta breve: usa utf8mb4
in 4 posizioni:
- I byte nel tuo client sono utf8, non latin1 / cp1251 / etc.
-
SET NAMES utf8mb4
o qualcosa di equivalente quando si stabilisce la connessione del client a MySQL -
CHARACTER SET utf8mb4
su tutte le tabelle / colonne - tranne le colonne che sono rigorosamente ascii / hex / country_code / zip_code / ecc. -
<meta charset charset=UTF-8>
se stai eseguendo l'output in HTML. (Sì, l'ortografia è diversa qui.)
Ulteriori informazioni ;
UTF8 fino in fondo
I link sopra riportati forniscono la " è necessaria una risposta canonica dettagliata per rispondere a tutte le preoccupazioni " ;. - C'è un limite di spazio su questo forum.
Modifica
Oltre a COLLATION utf8mb4_unicode_520_ci
contenente " tutti " personaggi del mondo, <=> è discutibile la migliore collazione "all-around" da usare. (Esistono anche raccolte turche, spagnole, ecc. Per chi desidera le sfumature in quelle lingue.)
Il set di caratteri è una proprietà del database (impostazione predefinita) e della tabella. Puoi dare un'occhiata (comandi MySQL):
show create database foo;
> CREATE DATABASE `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */
show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1
In altre parole; è abbastanza facile controllare il set di dati del database o modificarlo:
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
Per modificare la codifica del set di caratteri in UTF-8 per il database stesso, digitare il comando seguente in mysql > richiesta. USA ALTER DATABASE
.. Sostituisci DBNAME con il nome del database:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Questo è un duplicato di questa domanda Come convertire un intero set di caratteri e regole di confronto di un database MySQL in UTF-8?
Ho seguito la soluzione di Javier, ma ho aggiunto alcune righe diverse in my.cnf:
[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8
Ho trovato questa idea qui: http: // dev. mysql.com/doc/refman/5.0/en/charset-server.html nel primo / unico commento dell'utente nella parte inferiore della pagina. Egli menziona che skip-character-set-client-handshake ha una certa importanza.
Questi suggerimenti su MySQL e UTF-8 possono essere utili . Sfortunatamente, non costituiscono una soluzione completa, ma solo gotcha comuni.
Imposta database collation
su UTF-8
quindi applica table collation
al valore predefinito del database.
La tua risposta è che puoi configurare da Impostazioni MySql. Nella mia risposta potrebbe essere qualcosa che è andato fuori dal contesto, ma questo è anche sapere che è di aiuto per te.
come configurare Character Set
e Collation
.
Per le applicazioni che memorizzano dati utilizzando il set di caratteri MySQL predefinito e regole di confronto (
latin1, latin1_swedish_ci
), nessuna configurazione speciale dovrebbe essere necessario. Se le applicazioni richiedono l'archiviazione dei dati utilizzando a set di caratteri o regole di confronto diversi, è possibile configurare il set di caratteri informazioni in vari modi:
- Specifica le impostazioni dei caratteri per database. Ad esempio, applicazioni
che utilizzano un database potrebbe richiedere
utf8
, mentre le applicazioni che utilizzare un altro database potrebbe richiedere sjis. - Specifica le impostazioni dei caratteri all'avvio del server. Ciò causa il server per utilizzare le impostazioni fornite per tutte le applicazioni che non ne fanno altre accordi.
- Specifica le impostazioni dei caratteri al momento della configurazione , se costruisci MySQL dalla fonte. Questo fa sì che il server utilizzi le impostazioni fornite per tutti applicazioni, senza doverle specificare all'avvio del server.
Gli esempi mostrati qui per la tua domanda per impostare il set di caratteri utf8, qui anche impostare la fascicolazione per una maggiore utilità (utf8_general_ci
fascicolazione`).
Specifica le impostazioni dei caratteri per database
CREATE DATABASE new_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
Specifica le impostazioni dei caratteri all'avvio del server
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
Specifica le impostazioni dei caratteri al momento della configurazione di MySQL
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
Per vedere i valori del set di caratteri e le variabili del sistema di confronto che si applicano alla tua connessione, usa queste istruzioni:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Questa potrebbe essere una risposta lunga ma c'è tutto, puoi usarla. Spero che la mia risposta sia utile per te. per ulteriori informazioni http://dev.mysql.com/doc/ refman / 5.7 / en / charset-applications.html
SET NAMES UTF8
Questo è il trucco
CONNESSIONE DATABASE A UTF-8
$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());
Imposta la tua connessione al database su UTF8:
if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){
//set to utf8 encoding
mysql_set_charset('utf8',$handle);
}
È stato in grado di trovare una soluzione. Esegui quanto segue in http://technoguider.com/2015/ 05 / utf8-set-up-in-mysql /
SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = ’SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;