2015-12-03 81 views
1

我有一個阿拉伯語的字符串說如何使用python在mysql數據庫中存儲阿拉伯語文本?

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

我想寫這個阿拉伯文字轉換成MySQL數據庫。我試着用

txt = smart_str(txt) 

txt = text.encode('utf-8') 

這兩個din't工作,因爲他們coverted的字符串

u'Arabic (\xd8\xa7\xd9\x84\xd8\xb7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86)' 

而且我的數據庫字符集已被設置爲UTF-8

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

因此,由於這個新的單代碼,我的數據庫顯示與編碼文本相關的字符。請幫忙。我希望我的阿拉伯文文本得到保留。

也並從MySQL數據庫這個阿拉伯文字的快速導出寫同樣的阿拉伯語文本文件或將再次將其轉換回爲Unicode?

我用foolowing代碼中插入

cur.execute("INSERT INTO tab1(id, username, text, created_at) VALUES (%s, %s, %s, %s)", (smart_str(id), smart_str(user_name), smart_str(text), date)) 

此前這個時候我沒有使用smart_str,它拋出一個錯誤,說只有「的Latin-1」是允許的。

+0

你能告訴我們你用來執行INSERT的代碼嗎? –

+0

我已經包含了插入。請幫助 – kkoe

回答

1

爲了澄清一些事情,因爲它會幫助你一起在未來也是如此。

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

這不是阿拉伯字符串。這是一個unicode 對象,帶有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) 

那是什麼告訴你的是,一些數在表格latin-1中不存在unicode對象,所以程序不知道如何將其轉換爲字節。

計算機存儲字節。因此,當存儲或傳輸信息時,您需要始終正確編碼/解碼。

這個編碼/解碼步驟有時被稱爲unicode sandwich - 外面的一切都是字節,裏面的所有東西都是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從支持阿拉伯語一個終端或應用程序;否則 - 即使它正確插入,當它被程序顯示時 - 你將看到垃圾字符。

+0

謝謝你,先生。這非常有教育意義。萬分感謝:) – kkoe

2

只需執行SET names utf8執行你的INSERT前:

cur.execute("set names utf8;") 

cur.execute("INSERT INTO tab1(id, username, text, created_at) VALUES (%s, %s, %s, %s)", (smart_str(id), smart_str(user_name), smart_str(text), date)) 

你提的問題是非常相似的this SO post,你應該閱讀。

+0

嗨,先生,感謝您的重播,因爲我前面提到的,我可以看到我的數據庫中UTF-8文本但UTF-8文本不是阿拉伯語。 – kkoe

+0

當我用smart_str()則轉換\ u0627 \這是阿拉伯語\ XD8 \別的 – kkoe

+0

只需插入原始的阿拉伯語。無需將其轉換爲Unicode。 –