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:
- asegurarse
utf8mb4
fue utilizado paraCHAR
,VARCHAR
, yTEXT
columnas en MySQL - hacer cumplir UTF-8 en Python
- 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")