Python2.7操作Mysql数据库及乱码解决方案(附mysqldb win32 py2.7下载)

来源:互联网 发布:2016免费顶级域名 编辑:程序博客网 时间:2024/05/18 21:08

mysql是一个优秀的开源数据库,它现在的应用非常的广泛,因此很有必要简单的介绍一下用python操作mysql数据库的方法。python操作MySQL数据库需要安装一个第三方的模块,在http://mysql-python.sourceforge.net/有下载和文档。或者在本站下载:Python2.7+mysqldb win32 py2.7,下载后解压并直接默认安装即可。OK,如果你顺利安装完毕,你就可以使用Python访问MySQL数据库了。

这里先看一下使用的示例

# -*- coding: utf-8 -*-import os, sys, stringimport MySQLdb# 连接数据库try:  conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',db='test')except Exception, e:  print e  sys.exit()# 获取cursor对象来进行操作cursor = conn.cursor()# 创建表sql = "create table if not exists test1(name varchar(128) primary key, age int(4))"cursor.execute(sql)# 插入数据sql = "insert into test1(name, age) values ('%s', %d)" % ("zhaowei", 23)try:  cursor.execute(sql)except Exception, e:  print esql = "insert into test1(name, age) values ('%s', %d)" % ("张三", 21)try:  cursor.execute(sql)except Exception, e:  print e# 插入多条sql = "insert into test1(name, age) values (%s, %s)"val = (("李四", 24), ("王五", 25), ("洪六", 26))try:  cursor.executemany(sql, val)except Exception, e:  print e#查询出数据sql = "select * from test1"cursor.execute(sql)alldata = cursor.fetchall()# 如果有数据返回,就循环输出, alldata是有个二维的列表if alldata:  for rec in alldata:    print rec[0], rec[1]cursor.close()conn.close()

如果你的MySQL采用的是UTF-8编码,那么你在测试上面代码的时候,比如我是用下面的代码:

# -*- coding: utf-8 -*-import os, sys, stringimport MySQLdb# 连接数据库try:  conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test')except Exception, e:  print e  sys.exit()# 获取cursor对象来进行操作cursor = conn.cursor()#查询出数据sql = "select * from 203_class"cursor.execute(sql)alldata = cursor.fetchall()# 如果有数据返回,就循环输出, alldata是有个二维的列表if alldata:    for rec in alldata:        print rec[0], rec[1]cursor.close()conn.close()

如果你从数据库中取出的值包含中文,那么你看到的将是“?”,如下图所示:

一步步解决

出现乱码,我首先考虑到使用:set names 'UTF8'

于是我在获取cursor对象之后增加下面语句:

sql = "set names 'UTF8'"cursor.execute(sql)

执行的结果仍是乱码,如下图所示:


奇怪?问题出在哪?

由于数据库是我自己的一个项目正使用的数据库,通过PHP操作从未出现过乱码现象。(附:MySQL终极配置解决UTF8编码出现的乱码问题)不会是数据库的问题。重点还是放到Python的代码上。后来在测试连接数据库这块加上charset属性,如下:

conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test',charset='UTF8')

解决乱码问题,如下图所示:

接着,我去掉 set names 'UTF8' 语句,最终代码如下所示

# -*- coding: utf-8 -*-import os, sys, stringimport MySQLdb# 连接数据库try:  conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test',charset='UTF8')except Exception, e:  print e  sys.exit()# 获取cursor对象来进行操作cursor = conn.cursor()#查询出数据sql = "select * from 203_class"cursor.execute(sql)alldata = cursor.fetchall()# 如果有数据返回,就循环输出, alldata是有个二维的列表if alldata:    for rec in alldata:        print rec[0], rec[1]cursor.close()conn.close()

取出的数据正常显示,未出现乱码现象。

另外,如果在连接数据库时不指定UTF8编码。采用 cursor.execute("set names 'GBK'") 方式,如下面代码所示

# -*- coding: utf-8 -*-import os, sys, stringimport MySQLdb# 连接数据库try:  conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test')except Exception, e:  print e  sys.exit()# 获取cursor对象来进行操作cursor = conn.cursor()sql = "set names 'GBK'"cursor.execute(sql)#查询出数据sql = "select * from 203_class"cursor.execute(sql)alldata = cursor.fetchall()# 如果有数据返回,就循环输出, alldata是有个二维的列表if alldata:    for rec in alldata:        print rec[0], rec[1]cursor.close()conn.close()

也能正确显示汉字,不出现乱码问题。不过我总感觉这有些别扭。所以,解决MySQL为utf8编码的情况下出现乱码问题,有下面两种解决办法:

1、在连接数据库代码中利用charset属性指定为utf8编码

2、利用cursor.execute("set names 'GBK'") 方式指定

剩下的事情,就是你自己的决定了。

等一下,现在不要急做决定,先认真看完这一篇文章:python 中文乱码问题深入分析,对Python中出现的乱码问题就有一个更好的理解。本篇内容只是解决了问题,而未探究问题的根源。这也就是为什么上面我所说的“感觉有些别扭”。在下面的代码中,利用“Python中文乱码问题深入分析”这篇文章的知识,解决乱码问题:

# -*- coding: utf-8 -*-import os, sys, stringimport MySQLdbimport codecs# 连接数据库try:  conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='dj480')except Exception, e:  print e  sys.exit()# 获取cursor对象来进行操作cursor = conn.cursor()cursor.execute("set names 'UTF8'")#查询出数据sql = "select * from 203_class"cursor.execute(sql)alldata = cursor.fetchall()# 如果有数据返回,就循环输出, alldata是有个二维的列表if alldata:    for rec in alldata:        print rec[0], rec[1].decode("utf-8")cursor.close()conn.close()

上面的代码中,由于rec[0]的值为数字,所以,如果你写成:rec[0].decode("utf-8"),那么会返回如下错误:

将数字转换为字符串即可。

接下来,我得忙别的事了,如果这篇文章有遗漏或缺陷的地方,以后抽空在补充。并且继续完善。目前解决问题的方法仅做参考。欢迎交流和相互学习。

原创粉丝点击