2014-10-23 23 views
5

Come faccio a codificare qualcosa in ut8mb4 in Python?Come codificare (utf8mb4) in Python

Ho due serie di dati: i dati che sto migrando al mio nuovo database MySQL rispetto a Parse, e dati in corso (che parla solo al mio nuovo database). Il mio database è utf8mb4 per memorizzare emoji e lettere accentate.

La prima serie di dati mostra solo fino correttamente (quando emoji e gli accenti sono coinvolti), quando ho nel mio script python:

MySQLdb.escape_string(unicode(xstr(data.get('message'))).encode('utf-8')) 

e durante la lettura dal database MySQL in PHP:

$row["message"] = utf8_encode($row["message"]); 

Il secondo set di dati viene visualizzato correttamente (quando sono presenti emoji e accenti) quando NON includo la parte utf8_encode($row["message"]). Sto cercando di riconciliarli in modo che entrambi i set di dati vengano restituiti correttamente alla mia app iOS. Per favore aiuto!

+1

Presumo che stai parlando di MySQL ? Se è così, l'utf8 di Python dovrebbe essere identico a utf8mb4 di MySQL. Puoi essere più specifico su cosa stai facendo e i risultati che vedi? –

+0

Sembra utf8mb4 è qualcosa che MySQL ha inventato perché la loro implementazione ut8 funziona solo con i caratteri BMP. Questo non è il caso del normale utf8, che può codificare qualsiasi carattere unicode. Questa è la codifica che Python sta usando. Forse MySQL offre una serie di funzioni per lavorare con la loro codifica personalizzata? – Cameron

+0

@MarkRansom hanno aggiunto altro alla domanda per essere più specifici – user3781236

risposta

9

di utf8mb4 encoding MySQL è solo standard di UTF-8.

Hanno dovuto aggiungere quel nome per distinguerlo dallo broken UTF-8 character set che supportava solo i caratteri BMP.

In altre parole, si dovrebbe sempre codificare in UTF-8 quando si parla di MySQL, ma tener conto che il database non può essere in grado di gestire codepoints Unicode oltre U + FFFF, a meno che non si utilizza utf8mb4sul lato MySQL.

15

Mi sono sforzato con lo scambio corretto dell'intera gamma di caratteri UTF-8 tra Python e MySQL per il vantaggio di Emoji e di altri caratteri oltre il punto di codice U + FFFF.

per essere sicuri che tutto ha funzionato bene, ho dovuto effettuare le seguenti operazioni:

  1. assicurarsi utf8mb4 è stato utilizzato per CHAR, VARCHAR e TEXT colonne in MySQL
  2. far rispettare UTF-8 in Python
  3. ENFORCE UTF-8 da utilizzare tra Python e MySQL

per applicare UTF-8 in Python, aggiungere il seguente lin e come prima o seconda linea dello script Python:

# -*- coding: utf-8 -*- 

Per far rispettare UTF-8 tra Python e MySQL, impostare la connessione MySQL come segue:

# Connect to mysql. 
dbc = MySQLdb.connect(host='###', user='###', passwd='###', db='###', use_unicode=True) 

# Create a cursor. 
cursor = dbc.cursor() 

# Enforce UTF-8 for the connection. 
cursor.execute('SET NAMES utf8mb4') 
cursor.execute("SET CHARACTER SET utf8mb4") 
cursor.execute("SET character_set_connection=utf8mb4") 

# Do database stuff. 

# Commit data. 
dbc.commit() 

# Close cursor and connection. 
cursor.close() 
dbc.close() 

In questo modo, non è necessario utilizzare funzioni come encode e utf8_encode.

+2

Elenco di controllo molto utile. Mi ha salvato da un fumante. –

+0

Questo risolve il problema che avevo riscontrato con mysql + python + emojis –

+0

La riga 'coding' si applica * solo a come Python decodifica i valori letterali di stringa nel codice sorgente *. Non su come vengono gestite la codifica e la decodifica di * data *. A meno che non si siano usati caratteri non ASCII in stringhe letterali, non è necessario impostarlo. –

0

use_unicode=True non ha funzionato per me.

La mia soluzione

  • in MySQL, cambiare tutta la codifica del database, tavolo e campo per utf8mb4
  • MySQLdb.connect(host='###' [...], charset='utf8'
  • dbCursor.execute('SET NAMES utf8mb4')
  • dbCursor.execute("SET CHARACTER SET utf8mb4")