Cómo codificar (utf8mb4) en Python

¿Cómo puedo codificar algo en ut8mb4 en Python?

Tengo dos conjuntos de datos: los datos que estoy migrando a mi nueva base de datos MySQL desde Parse, y los datos en adelante (que solo se refieren a mi nueva base de datos). Mi base de datos es utf8mb4 para almacenar emoji y letras acentuadas.

El primer conjunto de datos solo se muestra correctamente (cuando hay emoji y acentos involucrados) cuando tengo en mi script de python:

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

y al leer de la base de datos MySQL en PHP:

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

El segundo conjunto de datos solo se muestra correctamente (cuando están involucrados emoji y acentos) cuando NO utf8_encode($row["message"]) la parte utf8_encode($row["message"]) . Estoy tratando de conciliar esto para que ambos conjuntos de datos se devuelvan correctamente a mi aplicación iOS. ¡Por favor ayuda!

La encoding utf8mb4 de MySQL es simplemente estándar UTF-8 .

Sin embargo, tuvieron que agregar ese nombre para distinguirlo del conjunto de caracteres UTF-8 roto que solo admite caracteres BMP.

En otras palabras, siempre debe codificar en UTF-8 al hablar con MySQL, pero tenga en cuenta que es posible que la base de datos no pueda manejar puntos de código Unicode más allá de U + FFFF, a menos que use utf8mb4 en el lado de MySQL .

En general, desea evitar la encoding y deencoding manual. Configure su conexión y sus intercalaciones para manejar Unicode por usted. Para MySQLdb , eso significa configurar charset='utf8' (esto establece use_unicode=True y maneja SET NAMES y SET character_set_connection ), luego maneja todo el texto en el lado de Python como texto Unicode.

Me he esforzado por intercambiar correctamente la gama completa de caracteres UTF-8 entre Python y MySQL por Emoji y otros caracteres más allá del punto de código U + FFFF.

Para estar seguro de que todo funcionaba bien, tenía que hacer lo siguiente:

  1. asegúrese de que utf8mb4 se utilizó para las columnas CHAR , VARCHAR y TEXT en MySQL
  2. aplicar UTF-8 en Python
  3. aplicar UTF-8 para ser utilizado entre Python y MySQL

Para aplicar UTF-8 en Python, agregue la siguiente línea como primera o segunda línea de su script de Python:

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

Para aplicar UTF-8 entre Python y MySQL, configure la conexión MySQL de la siguiente manera:

 # 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() 

De esta manera, no necesita utilizar funciones como encode y utf8_encode .

use_unicode=True no funcionó para mí.

Mi solución

  • en mysql, cambie la encoding completa de la base de datos, la tabla y el campo a utf8mb4
  • MySQLdb.connect(host='###' [...], charset='utf8'
  • dbCursor.execute('SET NAMES utf8mb4')
  • dbCursor.execute("SET CHARACTER SET utf8mb4")