溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解決Python調(diào)用MySQLdb插入中文亂碼的問(wèn)題

發(fā)布時(shí)間:2022-03-25 13:32:58 來(lái)源:億速云 閱讀:163 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹如何解決Python調(diào)用MySQLdb插入中文亂碼的問(wèn)題,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

MySQLdb插入中文亂碼

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import MySQLdb
def main():
    fullname = "趙錢孫李"
 
    conn = MySQLdb.connect(host='localhost', user='root',passwd='123', db='account', charset='utf8')  # OK
    #conn = MySQLdb.connect(host='localhost', user='root',passwd='123', db='account')  # Error!!!
    cursor = conn.cursor()
    cursor.execute("insert into account (username,password) values ('%s','%s')" % (fullname, "111"))
    conn.commit()
    cursor.close()
    conn.close()
 
if __name__ == "__main__":
    main()

如果從終端查詢到數(shù)據(jù)庫(kù)中的中文是亂碼,那么在連接時(shí)給出charset參數(shù)即可(當(dāng)然數(shù)據(jù)庫(kù)和表必須全部都是utf-8的)。

否則默認(rèn)插入的字符應(yīng)該是latin-1的(用fullname.decode('utf8')時(shí)報(bào)該錯(cuò)誤)。

然后將從數(shù)據(jù)庫(kù)中讀取的中文輸出到網(wǎng)頁(yè),如果沒(méi)有任何內(nèi)容顯示,加入以下代碼可解決:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Python內(nèi)部處理編碼默認(rèn)是ascii的:

print sys.getdefaultencoding()

MySQLdb使用utf-8 編碼插入中文數(shù)據(jù)

這幾天忙著幫人做一個(gè)從網(wǎng)頁(yè)抓取股票信息并把相應(yīng)信息存入MySQL中的程序。

使用環(huán)境

  • Python 2.5 for Windows

  • MySQLdb 1.2.2 for Python 2.5

  • MySQL 4.1.22

在寫程序中遇到了些怪的故障。

第一個(gè)問(wèn)題:插入中文失敗

這個(gè)是由于字符編碼問(wèn)題引起的。MySQL安裝時(shí)我已經(jīng)設(shè)置為utf8編碼,表也是使用utf8編碼建立。程序中只要在開頭寫好#-*- coding: utf-8 -*-,并在設(shè)定連接字符串時(shí)候?qū)懬迨褂胾tf8就可以了conn=MySQLdb.connect(host="127.0.0.1",user="webdb",passwd="web123",db="web",charset="utf8")。

設(shè)置之后從MySQL中取出的以u(píng)tf8編碼保存的中文也不會(huì)發(fā)生亂碼。 

對(duì)中文字符串,如:a = "浦發(fā)銀行",在進(jìn)行插入操作前做一下編碼轉(zhuǎn)換a = a.decode("gbk").encode("utf-8")。然后進(jìn)行插入操作就沒(méi)有任何問(wèn)題了。

第二個(gè)問(wèn)題:能插入之后無(wú)法在MySQL中保存剛才插入的數(shù)據(jù)

經(jīng)過(guò)檢查數(shù)據(jù)可以被正確的插入,但是連接斷開之后不保存在表中。經(jīng)過(guò)檢查發(fā)現(xiàn)原來(lái)是漏了conn.commit()。需要在語(yǔ)句執(zhí)行之后提交操作。

源代碼如下:

 # -*- coding: utf-8 -*-
 import  sys,MySQLdb
conn = MySQLdb.connect(host = " 127.0.0.1 " ,user = " webdb " ,passwd = " web123 " ,db = " web " ,charset = " utf8 " )     # 需要設(shè)定一下charset為utf-8
 cursor = conn.cursor()     # 生成連接的指針對(duì)象
 # 進(jìn)行字符串編碼轉(zhuǎn)換并進(jìn)行插入
 a  =   " 浦發(fā)銀行 "
a  =  a.decode( " gbk " ).encode( " utf-8 " )     # 編碼轉(zhuǎn)換為utf-8
 sql = " insert into stocklist (stockno,stockname) values (%s,%s) "      # 生成sql語(yǔ)句
 param = ( ' 600000 ' ,a)     # 生成sql語(yǔ)句的參數(shù)
 n  =  cursor.execute(sql,param)     # 執(zhí)行sql語(yǔ)句
# 以上操作等價(jià)于n = cursor.execute("insert into stocklist (stockno,stockname) values ('430004','"+ "浦發(fā)銀行".decode("gbk").encode("utf-8") + "')")
 print  n
conn.commit()  # 提交操作結(jié)果
 # 進(jìn)行查詢操作檢查剛剛執(zhí)行的插入操作結(jié)果
 n  =  cursor.execute( " select * from stocklist " )
 for  row  in  cursor.fetchall():
     print  row[0]  +  row[ 1 ]
cursor.close()     # 關(guān)閉指針
 conn.close()     # 關(guān)閉連接

以上是“如何解決Python調(diào)用MySQLdb插入中文亂碼的問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI