1. 程式人生 > >windows環境下python2.7連線mysql插入資料亂碼問題

windows環境下python2.7連線mysql插入資料亂碼問題

1.問題:在windows環境下使用PyCharm時,我想向mysql的一張表中插入資料,程式碼如下

import MySQLdb
from scrapy.conf import settings
class XiaoHuar_Pipeline(object):
    def process_item(self, item, spider):
        host = settings['MYSQL_HOST']
        user = settings['MYSQL_USER']
        psd = settings['MYSQL_PASSWORD']
        db = settings['MYSQL_DB']
        port = settings['MYSQL_PORT']
        charset = settings['CHARSET']
        con = MySQLdb.connect(host=host,user=user,passwd=psd,db=db,port=port)
        cue = con.cursor()
        print "mysql connect successfully"
        sql = "insert into girl(name,school,pic) values('{0}','{1}','{2}')".format(item['name'],item['school'],item['pic'])
        cue.execute(sql)
        con.commit()
        con.close()
        return item

由於插入的資料中有中文,mysql中出現了亂碼


2.原因:考慮到我的資料庫編碼是utf-8


於是我在連線資料庫時,加入charset='utf-8',結果出現錯誤

con = MySQLdb.connect(host=host,user=user,passwd=psd,db=db,port=port,charset='utf-8')

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "D:\PyWorkspace\p1\p1\pipelines.py", line 17, in process_item
    con = MySQLdb.connect(host=host,user=user,passwd=psd,db=db,port=port,charset='utf-8')
  File "C:\Python27\lib\site-packages\MySQLdb\__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 215, in __init__
    self.set_character_set(charset)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 294, in set_character_set
    super(Connection, self).set_character_set(charset)
OperationalError: (2019, "Can't initialize character set utf-8 (path: c:\\Program Files\\MySQL\\MySQL Server 5.1\\\\share\\charsets\\)")

通過google之後發現,原來python2中使用的是'utf8'而不是'utf-8',於是對程式碼進行修改

con = MySQLdb.connect(host=host,user=user,passwd=psd,db=db,port=port,charset='utf8')

更改之後,中文就可以正常插入資料庫了。