Saltar al contenido

Cómo codificar (utf8mb4) en Python

Solución:

He tenido problemas con el intercambio correcto de la gama completa de caracteres UTF-8 entre Python y MySQL por el bien de Emoji y otros caracteres más allá del punto de código U + FFFF.

Para estar seguro de que todo funcionaba bien, tuve que hacer lo siguiente:

  1. asegurarse utf8mb4 fue utilizado para CHAR, VARCHAR, y TEXT columnas en MySQL
  2. hacer cumplir UTF-8 en Python
  3. hacer cumplir UTF-8 para que se use entre Python y MySQL

Para aplicar UTF-8 en Python, agregue la siguiente línea como primera o segunda línea de su secuencia de comandos 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 forma, no es necesario utilizar funciones como encode y utf8_encode.

MySQL utf8mb4 la codificación es solo UTF-8 estándar.

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

En otras palabras, desde el lado de Python, siempre debe codificar en UTF-8 cuando hable 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.

Sin embargo, en términos generales, desea evitar a mano codificación y decodificación, y en su lugar déjelo a MySQLdb preocuparse por esto. Para ello, configure su conexión y sus intercalaciones para manejar el texto Unicode de forma transparente. Para MySQLdb, eso significa establecer charset="utf8mb4":

database = MySQLdb.connect(
    host=hostname,
    user=username,
    passwd=password,
    db=databasename,
    charset="utf8mb4"
)

Luego usa Python 3 normal str instrumentos de cuerda; dejar el use_unicode opción establecida en su valor predeterminado True*.

Nota: esto maneja SET NAMES y SET character_set_connection) para ti, no es necesario emitirlos manualmente.


* A menos que todavía use Python 2, el valor predeterminado es False. Ponlo en True y use u'...' cadenas unicode.

use_unicode=True no funcionó para mí.

Mi solución

  • en mysql, cambie la codificación 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")
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *