2016-02-01 16 views
41

Cerco di salvare i nomi degli utenti da un servizio nel mio database MySQL. Quei nomi possono contenere emoji come (solo per esempi)MySQL utf8mb4, Errori durante il salvataggio di Emojis

Dopo aver cercato un po 'ho trovato questo collegamento stackoverflow a questo tutorial. Ho seguito i passaggi e sembra che tutto sia configurato correttamente.

Ho un database (charset e collation impostato utf8mb4 (_unicode_ci)), una tabella denominata TestTable, anche configurato in questo modo, così come una colonna "Testo", configurato in questo modo (VARCHAR (191) utf8mb4_unicode_ci).

Quando cerco di salvare emoji ottengo un errore:

Example of error for shortcake(): 
    Warning: #1300 Invalid utf8 character string: 'F09F8D' 
    Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1 

L'unica Emoji che ero in grado di salvare correttamente è stato il sole ☀️

Anche se non ho provato tutti loro Ad essere onesti.

C'è qualcosa che mi manca nella configurazione?

Nota: Tutti i test di risparmio non hanno riguardato un client. Io uso phpmyadmin per modificare manualmente i valori e salvare i dati. Quindi la corretta configurazione del lato client è qualcosa che mi prenderò cura di dopo il il server salva correttamente gli emoji.

Un'altra Sidenote: Attualmente, quando si salvano emoji io o l'errore come sopra, o ottengo nessun errore ei dati di Username saranno memorizzati come Username ????. Errore o nessun errore dipende dal modo in cui io salvo. Quando creo/salvando tramite istruzione SQL, salvi con i punti interrogativi, quando modifichi in linea salvi con i punti interrogativi, quando modifichi utilizzando il pulsante di modifica ottengo l'errore.

ringraziamento

EDIT 1: Va bene quindi penso che ho scoperto il problema, ma non la soluzione. Sembra che le variabili specifiche del database non siano state modificate correttamente.

Quando ho effettuato l'accesso come root sul mio server e leggere le variabili (globali):
query utilizzata: SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

+--------------------------+--------------------+ 
| Variable_name   | Value    | 
+--------------------------+--------------------+ 
| character_set_client  | utf8mb4   | 
| character_set_connection | utf8mb4   | 
| character_set_database | utf8mb4   | 
| character_set_filesystem | binary    | 
| character_set_results | utf8mb4   | 
| character_set_server  | utf8mb4   | 
| character_set_system  | utf8    | 
| collation_connection  | utf8mb4_unicode_ci | 
| collation_database  | utf8mb4_unicode_ci | 
| collation_server   | utf8mb4_unicode_ci | 
+--------------------------+--------------------+ 
10 rows in set (0.00 sec) 

Per la mia base di dati (in phpMyAdmin, la stessa query) Sembra come il seguente:

+--------------------------+--------------------+ 
| Variable_name   | Value    | 
+--------------------------+--------------------+ 
| character_set_client  | utf8    | 
| character_set_connection | utf8mb4   | 
| character_set_database | utf8mb4   | 
| character_set_filesystem | binary    | 
| character_set_results | utf8    | 
| character_set_server  | utf8    | 
| character_set_system  | utf8    | 
| collation_connection  | utf8mb4_unicode_ci | 
| collation_database  | utf8mb4_unicode_ci | 
| collation_server   | utf8mb4_unicode_ci | 
+--------------------------+--------------------+ 

Come posso regolare queste impostazioni sul database specifico? Anche se ho le prime impostazioni mostrate come predefinite, quando creo un nuovo database ottengo il secondo come impostazioni.

** Edit 2: ""

Ecco il mio my.cnf di file:

[client] 
port=3306 
socket=/var/run/mysqld/mysqld.sock 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4 

[mysqld_safe] 
socket=/var/run/mysqld/mysqld.sock 

[mysqld] 
user=mysql 
pid-file=/var/run/mysqld/mysqld.pid 
socket=/var/run/mysqld/mysqld.sock 
port=3306 
basedir=/usr 
datadir=/var/lib/mysql 
tmpdir=/tmp 
lc-messages-dir=/usr/share/mysql 
log_error=/var/log/mysql/error.log 
max_connections=200 
max_user_connections=30 
wait_timeout=30 
interactive_timeout=50 
long_query_time=5 
innodb_file_per_table 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

!includedir /etc/mysql/conf.d/ 
+1

è un problema phpmyadmin, prova altri client mysql. – jsxqf

+2

Non penso che sia un problema phpmyadmin. Come puoi vedere in Edit1, penso che ci sia qualche errata configurazione tra le variabili/parametri di conf/default e quelli sul database. Anche se durante la creazione di un nuovo database. – Loki

+0

Che cosa è '$ cfg [" DefaultCharset "]' nella configurazione PMA? – miken32

risposta

37

character_set_client, _connection, e _results essere tutti utf8mb4 per quella shortcake per essere commestibile.

Qualcosa, da qualche parte, sta impostando un sottoinsieme di quelli individualmente. Rovistare tra le impostazioni di my.cnf e phpmyadmin: qualcosa non sta impostando tutti e tre.

Se si esegue SET NAMES utf8mb4, tutti e tre sono impostati correttamente.

Il sole splendeva perché è solo 3-byte - E2 98 80; utf8 è sufficiente per codifiche utf8 a 3 byte di caratteri Unicode.

+0

OK, penso che questo mi avvicini. Grazie. Ho modificato la mia domanda e aggiunto my.cnf. Forse puoi vedere qualcosa lì dentro? – Loki

+1

La connessione deve avere 'utf8mb4'. Se non riesci a trovare dove farlo, esegui 'SET NAMES utf8mb4'. –

+0

Questa è una bella spiegazione su cosa è andato storto. Ma in aggiunta dovevo controllare la sessione e le variabili globali. La realizzazione delle variabili Session di PHPMyadmins era ancora errata e l'errore si verificava solo per l'amministratore. – Loki

3

È probabile che il servizio/l'applicazione si connetta con "utf8" anziché "utf8mb4" per il set di caratteri del client. Questo dipende dall'applicazione client.

Per un'applicazione PHP vedere http://php.net/manual/en/function.mysql-set-charset.php o http://php.net/manual/en/mysqli.set-charset.php

Per un'applicazione Python vedere https://github.com/PyMySQL/PyMySQL#example o http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicode

Inoltre, verificare che le colonne sono davvero utf8mb4. Un modo diretto è così:

mysql> SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_name = "user" AND column_name = "displayname"; 
+--------------------+ 
| character_set_name | 
+--------------------+ 
| utf8mb4   | 
+--------------------+ 
1 row in set (0.00 sec) 
4

Per me, si è scoperto che il problema si è verificato nel client mysql.

aggiornamenti client mysql my.cnf impostazione di char su un server e ha provocato l'impostazione di caratteri non desiderati.

Quindi, quello che dovevo fare è solo aggiungere character-set-client-handshake = FALSE. Disabilita le impostazioni del client disturbando le impostazioni del mio char.

my.cnf sarebbe così.

[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
... 

Spero che sia d'aiuto.

Problemi correlati