日期:2014-05-16  浏览次数:20459 次

MySQLdb访问mysql的中文字符问题解决之道

经测试,我们的开发环境解决中文字符问题的解决办法是同一到utf-8编码:

一、py源文件采用utf8编码,在文件开始添加

#coding=UTF-8

二、在使用MySQLdb建立和mysql数据库的连接并建立cursor对象时采用如下函数
def getConnection(self):
        try:
            host=self.getSetting('host')
            user=self.getSetting('user')
            passwd=self.getSetting('password')
            port=self.getSetting('port',3306)
            db=self.getSetting('database')
            conn=MySQLdb.connect(host=host,port=port,user=user,passwd=passwd,db=db
								 ,cursorclass=MySQLdb.cursors.DictCursor
                                 ,use_unicode=False, charset=self.dbCharset);
            ##do char magic 
            conn.set_character_set(self.dbCharset)
            return conn;
        except Exception,ex:
            print "connect mysql db failure! using settings: host=%s,user=%s,passwd=%s,port=%s,db=%s"%(host,user,passwd,port,db)
            print ex;
            
       
    def getCursor(self,conn):
        cursor = conn.cursor();
        cursor.execute('SET NAMES %s;' % self.dbCharset)
        cursor.execute('SET CHARACTER SET %s;' % self.dbCharset) 
        return cursor;
三、客户端(浏览器)传回的字符一律是采用utf8编码

这一直都工作的很好,中文字符顺利存入数据库并可以读取出来。直到有一天我们需要按照中文字段内容进行查询,无论采用什么手段,甚至在sql语句中直接写入utf8的字符编码,都不能获取符合条件的数据,同样的语句在管理工具中却能顺利的查询出来数据!看来还是MySQLdb传递过程中的问题,终于我看到了这两行代码

cursor.execute('SET NAMES %s;' % self.dbCharset)
cursor.execute('SET CHARACTER SET %s;' % self.dbCharset) 
当我注释掉这两行代码之后,上帝啊,终于查到数据了!最终getCursor方法变成这个样子:

def getCursor(self,conn):
        cursor = conn.cursor();
        #cursor.execute('SET NAMES %s;' % self.dbCharset)
        #cursor.execute('SET CHARACTER SET %s;' % self.dbCharset) 
        return cursor;
摒弃了任何额外的处理,至于为什么,这篇文章和这篇文章说的很细致,你可以研究一下,不过我是没有想明白,明明都是同一的utf8编码,是为什么就不行呢?望达者不吝赐教。