Да изясня някои неща, защото това ще ви помогне и в бъдеще.
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
Това не е арабски низ. Това е обект в Unicode , с уникод кодови точки. Ако трябваше просто да го отпечатате и ако терминалът ви поддържа арабски, ще получите изход по следния начин:
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
Сега, за да получите същия изход като Arabic (الطيران)
във вашата база данни, трябва да кодирате низа.
Кодирането взема тези кодови точки; и ги преобразува в байтове, така че компютрите да знаят какво да правят с тях.
Така че най-често срещаното кодиране е utf-8
, защото поддържа всички знаци на английски език, както и много други езици (включително арабски). Има и други, например windows-1256
също поддържа арабски. Има някои, които нямат препратки към тези числа (наречени кодови точки) и когато се опитате да кодирате, ще получите грешка като тази:
>>> 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)
Това ви казва, че някакво число в обекта unicode не съществува в таблицата latin-1
, така че програмата не знае как да го преобразува в байтове.
Компютрите съхраняват байтове. Така че, когато съхранявате или предавате информация, трябва винаги да я кодирате/декодирате правилно.
Тази стъпка за кодиране/декодиране понякога се нарича unicode сандвич - всичко отвън е байтове, всичко вътре е уникод.
Като изключим това, трябва да кодирате правилно данните, преди да ги изпратите към вашата база данни; за да направите това, кодирайте го:
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))
За да потвърдите, че се вмъква правилно, уверете се, че използвате mysql от терминал или приложение, което поддържа арабски; в противен случай - дори ако е въведен правилно, когато се покаже от вашата програма - ще видите символи за боклук.