Para aclarar algunas cosas, porque también te ayudará en el futuro.
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
Esta no es una cadena árabe. Este es un objeto Unicode , con puntos de código Unicode. Si simplemente lo imprimiera, y si su terminal es compatible con el árabe, obtendría un resultado como este:
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
Ahora, para obtener el mismo resultado como Arabic (الطيران)
en su base de datos, necesita codificar la cadena.
La codificación toma estos puntos de código; y convertirlos a bytes para que las computadoras sepan qué hacer con ellos.
Entonces, la codificación más común es utf-8
, porque admite todos los caracteres del inglés, además de muchos otros idiomas (incluido el árabe). También hay otros, por ejemplo, windows-1256
también admite árabe. Hay algunos que no tienen referencias para esos números (llamados puntos de código), y cuando intentas codificar, obtendrás un error como este:
>>> print(txt.encode('latin-1'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-14: ordinal not in range(256)
Lo que eso le dice es que algún número en el objeto Unicode no existe en la tabla latin-1
, por lo que el programa no sabe cómo convertirlo a bytes.
Las computadoras almacenan bytes. Por lo tanto, al almacenar o transmitir información, siempre debe codificarla/decodificarla correctamente.
Este paso de codificación/descodificación a veces se denomina sandwich Unicode - todo el exterior son bytes, todo el interior es unicode.
Con eso fuera del camino, debe codificar los datos correctamente antes de enviarlos a su base de datos; para hacer eso, codificalo:
q = u"""
INSERT INTO
tab1(id, username, text, created_at)
VALUES (%s, %s, %s, %s)"""
conn = MySQLdb.connect(host="localhost",
user='root',
password='',
db='',
charset='utf8',
init_command='SET NAMES UTF8')
cur = conn.cursor()
cur.execute(q, (id.encode('utf-8'),
user_name.encode('utf-8'),
text.encode('utf-8'), date))
Para confirmar que se está insertando correctamente, asegúrese de estar usando mysql desde una terminal o aplicación que admita árabe; de lo contrario, incluso si está insertado correctamente, cuando lo muestre su programa, verá caracteres basura.