2012-06-06 25 views
0

我在服務器上使用python與mySQL進行通信。如果一個非ASCII字符的字符串被賦予python傳遞到mySQL表字段,我從服務器得到這個錯誤。如何將python中的utf-8字符保存到mySQL

UnicodeEncodeError: 'ascii' codec can't encode characters in position 251-256: ordinal not in range(128) 

我該如何通過utf-8數據。我有評論:

"# -*- coding: utf-8 -*-" 

...包括在python主代碼頁,以及所有的代碼頁。

奇怪的是,我能夠從包含UTF-8字符的mySQL中獲取數據,並將其傳輸到JavaScript。

的代碼行,它試圖傳送數據如下:發生在註釋字段

sql = '''INSERT INTO clientMail (clientID,coID,MessageDate,TypeSent,Comments,FName) 
     VALUES(%s, %s, '%s', '%s', '%s', '%s') ''' % (clientID,companyID,currentDate,TypeSent,emailMessage,company_Name) 
print "===>>>>>>>>>>>>>",sql 

的UTF-8字符

任何幫助,將不勝感激...

回答

-1

您的數據應該是Unicode和字符串格式(%s)使用默認編碼(ASCII)強制它爲字符串類型。

在你的Unicode字符串中使用.encode('utf-8'),你就會全部設置好。

+0

你能給我一個關於如何實現這個函數的例子嗎?如何擺脫%s並用.encode()替換它...?對不起,我是新手... – DKean

+0

MySQL將數據返回給客戶端的編碼將取決於['character_set_results']的當前值(http://dev.mysql.com/doc/en /服務器系統變量。html#sysvar_character_set_results)會話變量:通常必須在連接到MySQL時指定所需的字符集,或者使用後面的SET NAMES命令(我不知道這裏使用的Python連接器是否可以處理這個問題..? )。 – eggyal

+0

這不太正確:'u'%s'%'a''返回unicode。 -1沒有提及他不應該使用字符串格式來生成SQL表達式。 – schlamar

5

一個非常快速的解決應是確保您的字符串是Unicode入手:

sql = u"INSERT..." 

即前綴字符串以u

但是,您應該使用而不是使用字符串格式將值內插到SQL語句中。您應該依靠MySQL的適配器來爲你做的,以確保您對SQL注入保護:

sql = u"INSERT... VALUES (%s, %s..)" 
cursor.execute(sql, (clientID, companyID...,)) 
+0

我得到這個結果使用你的建議...」c.execute(sql,clientID,companyID,currentDate,TypeSent,emailMessage,company_Name) TypeError:execute()最多3個參數(8給出)「但我只給了它6個參數和6個字段定義... – DKean

+1

道歉,值應該在一個單一的元組。改變。 –

+0

MySQL適配器如何防止SQL注入?我是新來的! – DKean

1

我想說的是有人在這裏沒有幫助,但我無法得到它去,不管我多麼努力......然而,謝謝大家的努力。無論如何,我從中學到了一些東西。

得到解決了這個無可否認的困難問題的方法如下:
的連接參數必須包括以下內容

... charset="utf8", use_unicode=True" 

沒有這些什麼都做得會的工作,因爲我的結論。但我是新手,所以不要太認真對待我。

儘管如此,非常感謝你們投身於....你們搖滾。

Dennis

+0

OMG !!!!謝謝sooooo多!我想我會打破我的想法! )) – Vor

相關問題