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

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, string
import 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 e

sql = "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, string
import 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, string
import 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, string
import 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, string
import MySQLdb
import 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"),那么会返回如下错误:

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值