Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar texto árabe no banco de dados mysql usando python?


Para esclarecer algumas coisas, porque isso também o ajudará no futuro.
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'

Esta não é uma string árabe. Este é um objeto unicode , com pontos de código unicode. Se você simplesmente imprimisse, e se o seu terminal suportasse árabe, você obteria uma saída assim:
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)

Agora, para obter a mesma saída como Arabic (الطيران) em seu banco de dados, você precisa codificar a string.

A codificação está tomando esses pontos de código; e convertê-los em bytes para que os computadores saibam o que fazer com eles.

Portanto, a codificação mais comum é utf-8 , porque suporta todos os caracteres do inglês, além de muitos outros idiomas (incluindo árabe). Existem outros também, por exemplo, windows-1256 também suporta árabe. Existem alguns que não têm referências para esses números (chamados de pontos de código) e quando você tenta codificar, receberá um erro 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)

O que isso está lhe dizendo é que algum número no objeto unicode não existe na tabela latin-1 , então o programa não sabe como convertê-lo em bytes.

Computadores armazenam bytes. Portanto, ao armazenar ou transmitir informações, você precisa sempre codificá-las/decodificá-las corretamente.

Essa etapa de codificação/decodificação às vezes é chamada de sanduíche unicode - tudo fora é bytes, tudo dentro é unicode.

Com isso fora do caminho, você precisa codificar os dados corretamente antes de enviá-los ao seu banco de dados; para fazer isso, codifique-o:
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 está sendo inserido corretamente, certifique-se de estar usando mysql de um terminal ou aplicativo que suporte árabe; caso contrário - mesmo se inserido corretamente, quando for exibido pelo seu programa - você verá caracteres inúteis.