Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich arabischen Text in einer MySQL-Datenbank mit Python?

Um ein paar Dinge klarzustellen, weil es Ihnen auch in Zukunft weiterhelfen wird.

txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'

Dies ist keine arabische Zeichenfolge. Dies ist ein Unicode-Objekt , mit Unicode-Codepunkten. Wenn Sie es einfach ausdrucken würden und Ihr Terminal Arabisch unterstützt, würden Sie folgende Ausgabe erhalten:

>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)

Nun, um dieselbe Ausgabe wie Arabic (الطيران) zu erhalten in Ihrer Datenbank müssen Sie die Zeichenkette kodieren.

Die Kodierung nimmt diese Codepunkte; und sie in Bytes umzuwandeln, damit Computer wissen, was sie damit machen sollen.

Die gebräuchlichste Kodierung ist also utf-8 , weil es alle Zeichen des Englischen sowie viele andere Sprachen (einschließlich Arabisch) unterstützt. Es gibt auch andere, zum Beispiel windows-1256 unterstützt auch Arabisch. Es gibt einige, die keine Referenzen für diese Nummern (sogenannte Codepunkte) haben, und wenn Sie versuchen, zu codieren, erhalten Sie einen Fehler wie diesen:

>>> 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)

Das sagt Ihnen, dass einige Zahlen im Unicode-Objekt nicht in der Tabelle latin-1 vorhanden sind , also weiß das Programm nicht, wie es es in Bytes umwandeln soll.

Computer speichern Bytes. Wenn Sie also Informationen speichern oder übertragen, müssen Sie sie immer korrekt codieren/decodieren.

Dieser Kodierungs-/Dekodierungsschritt wird manchmal als Unicode-Sandwich bezeichnet - alles außerhalb ist Bytes, alles innen ist Unicode.

Damit das aus dem Weg geräumt ist, müssen Sie die Daten korrekt codieren, bevor Sie sie an Ihre Datenbank senden. codieren Sie es dazu:

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))

Um zu bestätigen, dass es richtig eingefügt wird, vergewissern Sie sich, dass Sie mysql von einem Terminal oder einer Anwendung verwenden, die Arabisch unterstützt; andernfalls - auch wenn es korrekt eingefügt wurde, wenn es von Ihrem Programm angezeigt wird - werden Sie unbrauchbare Zeichen sehen.