Untuk memperjelas beberapa hal, karena itu akan membantu Anda di masa depan juga.
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
Ini bukan string bahasa Arab. Ini adalah objek unicode , dengan titik kode unicode. Jika Anda hanya mencetaknya, dan jika terminal Anda mendukung bahasa Arab, Anda akan mendapatkan output seperti ini:
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
Sekarang, untuk mendapatkan output yang sama seperti Arabic (الطيران)
di database Anda, Anda perlu menyandikan string.
Encoding mengambil poin kode ini; dan mengubahnya menjadi byte sehingga komputer tahu apa yang harus dilakukan dengannya.
Jadi pengkodean yang paling umum adalah utf-8
, karena mendukung semua karakter bahasa Inggris, ditambah banyak bahasa lain (termasuk bahasa Arab). Ada juga yang lain, misalnya windows-1256
juga mendukung bahasa Arab. Ada beberapa yang tidak memiliki referensi untuk angka-angka itu (disebut poin kode), dan ketika Anda mencoba untuk menyandikan, Anda akan mendapatkan kesalahan seperti ini:
>>> 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)
Apa yang memberitahu Anda bahwa beberapa nomor dalam objek unicode tidak ada dalam tabel latin-1
, sehingga program tidak tahu cara mengonversinya menjadi byte.
Komputer menyimpan byte. Jadi saat menyimpan atau mengirimkan informasi, Anda harus selalu mengkodekan/mendekodekannya dengan benar.
Langkah encode/decode ini terkadang disebut sandwich unicode - semua yang di luar adalah byte, semua yang ada di dalam adalah unicode.
Dengan itu, Anda perlu menyandikan data dengan benar sebelum Anda mengirimkannya ke database Anda; untuk melakukannya, enkodekan:
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))
Untuk mengonfirmasi bahwa itu dimasukkan dengan benar, pastikan Anda menggunakan mysql dari terminal atau aplikasi yang mendukung bahasa Arab; sebaliknya - meskipun dimasukkan dengan benar, ketika ditampilkan oleh program Anda - Anda akan melihat karakter sampah.