Python調(diào)用MySQLdb插入中文亂碼的解決
MySQLdb插入中文亂碼
#!/usr/bin/python # -*- coding: utf-8 -*- import MySQLdb def main(): fullname = "趙錢(qián)孫李" 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
在寫(xiě)程序中遇到了些怪的故障。
第一個(gè)問(wèn)題:插入中文失敗
這個(gè)是由于字符編碼問(wèn)題引起的。MySQL安裝時(shí)我已經(jīng)設(shè)置為utf8編碼,表也是使用utf8編碼建立。程序中只要在開(kāi)頭寫(xiě)好#-*- 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ù)可以被正確的插入,但是連接斷開(kāi)之后不保存在表中。經(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)閉連接
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python簡(jiǎn)單調(diào)用MySQL存儲(chǔ)過(guò)程并獲得返回值的方法
這篇文章主要介紹了Python調(diào)用MySQL存儲(chǔ)過(guò)程并獲得返回值的方法,涉及Python操作MySQL存儲(chǔ)過(guò)程的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07python調(diào)用golang中函數(shù)方法
由于simhash方法有多種實(shí)現(xiàn)方式,現(xiàn)python中simhash方法與golang中的不一樣,需要兩者代碼生成結(jié)果保持一致,故采用python中的代碼調(diào)用golang編譯的so文件來(lái)實(shí)現(xiàn),需要的朋友可以參考下2024-02-02python編寫(xiě)小程序探測(cè)linux端口占用情況
這篇文章主要介紹了python編寫(xiě)小程序探測(cè)linux端口占用情況,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-12-12Python中re模塊:匹配開(kāi)頭/結(jié)尾(^/$)
本文主要介紹了Python中re模塊:匹配開(kāi)頭/結(jié)尾(^/$),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08python單元測(cè)試unittest實(shí)例詳解
這篇文章主要介紹了python單元測(cè)試unittest用法,以實(shí)例形式詳細(xì)分析了Python中單元測(cè)試的概念、用法與相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05Python函數(shù)之zip函數(shù)的介紹與實(shí)際應(yīng)用
zip() 函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的對(duì)象(python2 返回的是這些元組組成的列表 ),下面這篇文章主要給大家介紹了關(guān)于Python函數(shù)之zip函數(shù)實(shí)際應(yīng)用的相關(guān)資料,需要的朋友可以參考下2022-03-03詳解Python?Flask?API?示例演示(附cookies和session)
這篇文章主要為大家介紹了Python?Flask?API?示例演示(附cookies和session)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03