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.