在项目中发现这样一个问题:sqlserver数据库编码为gbk,使用python3.4+pymssql 查询,中文乱码,经过一番思考问题解决,下面把解决办法分享给大家:
conn = pymssql.connect(host=192.168.122.141, port=1433, user=myshop, password=oyf20140208hh, database=myshopcmstock, charset='utf8', as_dict=true) cur = conn.cursor()sql = select top 10 [id],[name] from [user]cur.execute(sql)list = cur.fetchall()for row in list: print(row[id],row[name].encode('latin-1').decode('gbk'))
接下来给大家介绍python 使用pymssql连接sql server数据库
#coding=utf-8 #!/usr/bin/env python#-------------------------------------------------------------------------------# name: pymssqltest.py# purpose: 测试 pymssql库,该库到这里下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql## author: scott## created: 04/02/2012#-------------------------------------------------------------------------------import pymssqlclass mssql:对pymssql的简单封装pymssql库,该库到这里下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql使用该库时,需要在sql server configuration manager里面将tcp/ip协议开启用法:def __init__(self,host,user,pwd,db):self.host = hostself.user = userself.pwd = pwdself.db = dbdef __getconnect(self):得到连接信息返回: conn.cursor()if not self.db:raise(nameerror,没有设置数据库信息)self.conn = pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset=utf8)cur = self.conn.cursor()if not cur:raise(nameerror,连接数据库失败)else:return curdef execquery(self,sql):执行查询语句返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段调用示例:ms = mssql(host=localhost,user=sa,pwd=123456,db=pythonweibostatistics)reslist = ms.execquery(select id,nickname from weibouser)for (id,nickname) in reslist:print str(id),nicknamecur = self.__getconnect()cur.execute(sql)reslist = cur.fetchall()#查询完毕后必须关闭连接self.conn.close()return reslistdef execnonquery(self,sql):执行非查询语句调用示例:cur = self.__getconnect()cur.execute(sql)self.conn.commit()self.conn.close()cur = self.__getconnect()cur.execute(sql)self.conn.commit()self.conn.close()def main():## ms = mssql(host=localhost,user=sa,pwd=123456,db=pythonweibostatistics)## #返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段## ms.execnonquery(insert into weibouser values('2','3'))ms = mssql(host=localhost,user=sa,pwd=123456,db=pythonweibostatistics)reslist = ms.execquery(select id,weibocontent from weibo)for (id,weibocontent) in reslist:print str(weibocontent).decode(utf8)if __name__ == '__main__':main()
脚本之家提醒大家需要注意事项:
使用pymssql进行中文操作时候可能会出现中文乱码,我解决的方案是:
文件头加上 #coding=utf8
sql语句中有中文的时候进行encode
insertsql = insert into weibo([userid],[weibocontent],[publishdate]) values(1,'测试','2012/2/1').encode(utf8)
连接的时候加入charset设置信息
pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset=utf8)