2015-09-19 168 views
1

我正在研究一個代碼,它根據搜索詞從Twitter獲取實時tweets並將其保存到Mysql數據庫。但是,當我運行的代碼,而插入到數據庫它提出了一個錯誤:UnicodeDecodeError:'ascii'編解碼器無法解碼位置139中的字節0xe2:序號不在範圍內(128)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 139: ordinal not in range(128) 

我不明白有什麼問題就在這裏是代碼插入到數據庫

tweet = json.loads(data); 
    #print json.dumps(tweet, indent=4, sort_keys=True) 
    #print tweet['text'] 
    tweetid = tweet['id_str'] 
    userid = tweet['user']['id_str'] 
    text = tweet['text'].encode('utf-8') 
    cur.execute("""INSERT INTO twitterfeeeds(tweet_id, user_id,body,status) VALUES (%s,%s,%s,'0')"""%(tweetid,userid,text)) 
    db.commit() 

這裏的身體是在鳴叫文本狀態是它是否被處理。

回答

3

不要將您的推文編碼爲UTF-8,也不要使用字符串格式創建查詢。

使用SQL參數代替:

tweetid = tweet['id_str'] 
userid = tweet['user']['id_str'] 
text = tweet['text'] 
cur.execute(
    """INSERT INTO twitterfeeeds(tweet_id, user_id,body,status) VALUES (%s, %s, %s, '0')""", 
    (tweetid, userid, text)) 

是,有上述代碼和你之間的差值; tweetid,useridtext值都作爲一個單獨的參數(元組)傳遞給cursor.execute()方法。

遊標有責任處理正確的轉義數據以插入數據庫。這樣您可以避免SQL注入攻擊(與;DROP TABLE twitterfeeeds的推文會立即破壞您的數據庫),並啓用查詢計劃優化。

這一切都需要您配置數據庫連接以支持Unicode數據;字符集設置爲UTF-8的連接:

conn = MySQLdb.connect(host="localhost", user='root', password='', 
         db='', charset='utf8') 

或者更好的是,配置數據庫使用UTF8MB4字符集(的UTF-8版本的MySQL應用無法處理的表情符號或其他代碼點超出U + FFFF):

# Note, no characterset specified 
con = MySQLdb.connect(host="localhost", user='root', password='', db='') 
cursor = con.cursor() 
cursor.execute('SET NAMES utf8mb4') 
cursor.execute('SET CHARACTER SET utf8mb4') 
cursor.execute('SET character_set_connection=utf8mb4') 
+0

鳴叫時不進行編碼,它提出了另一個錯誤 UnicodeEncodeError:「拉丁-1 '編解碼器不能在位置234對字符u'\ u2026'進行編碼:序號不在範圍內(256) – Harwee

+0

@Harwee:不作爲查詢參數傳遞時。 –

+0

@Harwee:您確實需要將數據庫配置爲接受UTF-8 Unicode文本,目前您的數據庫只能處理Latin-1。 –

1

使用可以使用MySQLdb.escape_string來轉義unicode字符。

>> MySQLdb.escape_string("'") 
"\\'" 

此外,我認爲你必須與 'use_unicode' 打開 'mysql.connector':真正的配置:

config = { 
'user': ..., 
'password': ..., 
'host': '127.0.0.1', 
'use_unicode':True, 
'charset':'utf8', 
} 
db = mysql.connector.connect(**config) 
相關問題