首頁 > 軟體

Python呼叫MySQLdb插入中文亂碼的解決

2022-03-25 13:00:36

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()

如果從終端查詢到資料庫中的中文是亂碼,那麼在連線時給出charset引數即可(當然資料庫和表必須全部都是utf-8的)。

否則預設插入的字元應該是latin-1的(用fullname.decode('utf8')時報該錯誤)。

然後將從資料庫中讀取的中文輸出到網頁,如果沒有任何內容顯示,加入以下程式碼可解決:

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

Python內部處理編碼預設是ascii的:

print sys.getdefaultencoding()

MySQLdb使用utf-8 編碼插入中文資料

這幾天忙著幫人做一個從網頁抓取股票資訊並把相應資訊存入MySQL中的程式。

使用環境

  • Python 2.5 for Windows
  • MySQLdb 1.2.2 for Python 2.5
  • MySQL 4.1.22

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

第一個問題:插入中文失敗

這個是由於字元編碼問題引起的。MySQL安裝時我已經設定為utf8編碼,表也是使用utf8編碼建立。程式中只要在開頭寫好#-*- coding: utf-8 -*-,並在設定連線字串時候寫清使用utf8就可以了conn=MySQLdb.connect(host="127.0.0.1",user="webdb",passwd="web123",db="web",charset="utf8")。

設定之後從MySQL中取出的以utf8編碼儲存的中文也不會發生亂碼。 

對中文字串,如:a = "浦發銀行",在進行插入操作前做一下編碼轉換a = a.decode("gbk").encode("utf-8")。然後進行插入操作就沒有任何問題了。

第二個問題:能插入之後無法在MySQL中儲存剛才插入的資料

經過檢查資料可以被正確的插入,但是連線斷開之後不儲存在表中。經過檢查發現原來是漏了conn.commit()。需要在語句執行之後提交操作。

原始碼如下:

 # -*- coding: utf-8 -*-
 import  sys,MySQLdb
conn = MySQLdb.connect(host = " 127.0.0.1 " ,user = " webdb " ,passwd = " web123 " ,db = " web " ,charset = " utf8 " )     # 需要設定一下charset為utf-8
 cursor = conn.cursor()     # 生成連線的指標物件
 # 進行字串編碼轉換並進行插入
 a  =   " 浦發銀行 "
a  =  a.decode( " gbk " ).encode( " utf-8 " )     # 編碼轉換為utf-8
 sql = " insert into stocklist (stockno,stockname) values (%s,%s) "      # 生成sql語句
 param = ( ' 600000 ' ,a)     # 生成sql語句的引數
 n  =  cursor.execute(sql,param)     # 執行sql語句
# 以上操作等價於n = cursor.execute("insert into stocklist (stockno,stockname) values ('430004','"+ "浦發銀行".decode("gbk").encode("utf-8") + "')")
 print  n
conn.commit()  # 提交操作結果
 # 進行查詢操作檢查剛剛執行的插入操作結果
 n  =  cursor.execute( " select * from stocklist " )
 for  row  in  cursor.fetchall():
     print  row[0]  +  row[ 1 ]
cursor.close()     # 關閉指標
 conn.close()     # 關閉連線

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com