Om een paar dingen te verduidelijken, want het zal je ook in de toekomst verder helpen.
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
Dit is geen Arabische string. Dit is een Unicode object , met Unicode-codepunten. Als u het gewoon zou afdrukken en als uw terminal Arabisch ondersteunt, zou u de volgende uitvoer krijgen:
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
Om nu dezelfde uitvoer te krijgen als Arabic (الطيران)
in uw database, moet u de string coderen.
Coderen is het nemen van deze codepunten; en ze converteren naar bytes, zodat computers weten wat ze ermee moeten doen.
Dus de meest voorkomende codering is utf-8
, omdat het alle karakters van het Engels ondersteunt, plus een heleboel andere talen (inclusief Arabisch). Er zijn ook andere, bijvoorbeeld windows-1256
ondersteunt ook Arabisch. Sommige hebben geen verwijzing naar die nummers (codepunten genoemd), en wanneer u probeert te coderen, krijgt u een foutmelding als deze:
>>> 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)
Wat dat je vertelt, is dat een nummer in het unicode-object niet bestaat in de tabel latin-1
, dus het programma weet niet hoe het het naar bytes moet converteren.
Computers slaan bytes op. Dus wanneer u informatie opslaat of verzendt, moet u deze altijd correct coderen/decoderen.
Deze stap voor het coderen/decoderen wordt soms de unicode-sandwich genoemd. - alles buiten is bytes, alles binnen is unicode.
Met dat uit de weg, moet u de gegevens correct coderen voordat u deze naar uw database verzendt; om dat te doen, codeer het:
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))
Om te bevestigen dat het correct is ingevoegd, moet u ervoor zorgen dat u mysql gebruikt vanaf een terminal of toepassing die Arabisch ondersteunt; anders - zelfs als het correct is ingevoegd, wanneer het door uw programma wordt weergegeven - ziet u afvaltekens.