• 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编码,是为什么就不行呢?望达者不吝赐教。


  • 相关阅读:
    view 的继承关系
    dos 下小tip
    Required diagnostic data collection for RMAN backup
    数据库应用设计设计报告
    程序 从存储卡 内存卡 迁移到 SD卡
    c++ 参赛设置
    c++ 用构造函数
    Ip
    error C3872: “0x3000”: 此字符不允许在标识符中使用
    机器字长 32位与64位的区别
  • 原文地址:https://www.cnblogs.com/dajianshi/p/2827090.html
Copyright © 2020-2023  润新知