sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar texto árabe en la base de datos mysql usando python?

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.