python字符集的转换(mysql数据乱码的处理)

1.mysql乱码问题:

  • 背景:两个msyql库,字符集均为gbk,需要从A库中取数据,插入到B库中,其中某些字段值为中文。
  • 代码:
  • #!/usr/bin/env python
    # _*_ encoding:utf-8 _*_
    
    ‘‘‘
    author: tiantiandas
    ‘‘‘
    
    import sys
    reload(sys)
    sys.setdefaultencoding(‘gbk‘)
    import MySQLdb
    
    def Connect_Mysql(sql,host):
        db_info = {‘host‘: host,
                   ‘user‘: ‘test‘,
                   ‘db‘: ‘TestDB‘,
                   ‘passwd‘: ‘dnstest‘,
                   ‘charset‘:‘gbk‘} #很关键
        try:
            connect = MySQLdb.connect(**db_info)
            cursor = connect.cursor()
            cursor.execute(sql)
            connect.commit()
            result = cursor.fetchone()
            return result
        except Exception as e:
            print e
            sys.exit(10)
    
    def main():
        domain = sys.argv[1]
        query = ‘select Name,AdminDesc from EmailBox where Domain="{0}"‘.format(domain)
        try:
            Name, AdminDesc = Connect_Mysql(sql=query,host="host1")
            update = "update  EmailBox set Name=‘{0}‘,AdminDesc=‘{1} where Domain=‘{2}‘".format(Name,AdminDesc)
            try:
                print update
                Connect_Mysql(sql=update,host=‘host2‘)
            except Exception as e:
                print e
        except Exception as e:
            print e
    
    if __name__ == ‘__main__‘:
        main()
  • 几个关键点:
    • sys.setdefaultencoding(‘gbk‘)  :  这段代码让从A库拉出的数据,python会将其解码为成gbk。(大概是这个意思)
    • mysql编码: charset:gbk  :这个调整让写入到库中的数据字符集为gbk
  • 所以如果拉出的数据是为了自己看的时候,就不需要 sys.setdefaultencoding(‘gbk‘)这段代码了 。

2.关于编码和解码

  • chardet模块

    • chardet是字符编码识别的模块,使用如下:
    • #!/usr/bin/env python
      # _*_ encoding:utf-8 _*_
      import chardet
      
      a="天天"
      print chardet.detect(a)
      
      结果:
      {‘confidence‘: 0.75249999999999995, ‘encoding‘: ‘utf-8‘}
    • 如果要对一个大文件进行编码识别,如下的方法,可以提高识别速度:(相比第一种,这种确实会快一些)
    • import urllib
      from chardet.universaldetector import UniversalDetector
      usock = urllib.urlopen(‘http://www.baidu.com/‘)
      #创建一个检测对象
      detector = UniversalDetector()
      for line in usock.readlines():
          #分块进行测试,直到达到阈值
          detector.feed(line)
          if detector.done: break
      #关闭检测对象
      detector.close()
      usock.close()
      #输出检测结果
      print detector.result
      
      运行结果:
      {‘confidence‘: 0.99, ‘encoding‘: ‘GB2312‘}
    • 有了chardet模块,就可以识别获取数据的字符集格式,之后就可以将数据转换为想要的字符集格式了。
  • 两个函数:
    • decode:可以将数据解码为想要的字符集格式
    • encode:可以将数据编码为想要的字符集格式
    • python识别的是unicode,所以是用decode现将数据转换为unicode,之后再用encode将数据转换为想要的字符集。
  • 测试代码:
  • >>> name="天天"
    >>> name
    ‘\xe5\xa4\xa9\xe5\xa4\xa9‘  #天天 汉字的gbk码
    
    >>> b=name.decode(‘gbk‘)
    >>> b
    u‘\u6fb6\u2541\u3049‘
    
    >>> c=b.encode(‘utf8‘)
    >>> c
    ‘\xe6\xbe\xb6\xe2\x95\x81\xe3\x81\x89‘
    
    ——————————————————————————
    
    >>> ‘\xcc\xec\xcc\xec‘.decode(‘gbk‘)
    u‘\u5929\u5929‘
    >>> ‘\xcc\xec\xcc\xec‘.decode(‘gbk‘).encode(‘utf8‘)
    ‘\xe5\xa4\xa9\xe5\xa4\xa9‘
    >>> ‘天天‘
    ‘\xe5\xa4\xa9\xe5\xa4\xa9‘

时间: 2024-10-05 20:34:49

python字符集的转换(mysql数据乱码的处理)的相关文章

PHP存取MySQL 数据乱码的破解

以下的文章主要向大家介绍的是PHP(PHP培训 php教程 )存取MySQL(MySQL认证 Mysql培训 ) 数据乱码的实际解决方法我们大家都知道MySQL 数据中出现乱码是一件令人十分头痛的的事情,那么到底对其如何解决呢?以下的文章就有解答. 对PHP和MySQL 的研究并不深入,以下是我的一些个人心得,说的可能不是很明白,但确实是很管用的东西. 我的Discuz版本是UTF-8的,但是打开phpmyadmin显示的是 整理栏目:gbk_chinese_ci ,而且查看数据显示完全正常,没

python环境下使用mysql数据及数据结构和二叉树算法(图)

python环境下使用mysql数据及数据结构和二叉树算法(图):1 python环境下使用mysql2使用的是 pymysql库3 开始-->创建connection-->获取cursor-->操作-->关闭cursor->关闭connection->结束45 代码框架6 import pymysql.cursors7 ###连接数据库8 connection = pymysql.connect(host='127.0.0.1',port=3306,user='roo

MyEclipse+Hibernate写入MySQL数据乱码问题

首先,要统一MyEclipse的字符编码,步骤如下: 1.进入Window--Preferences--General--Workspace,Text file encoding 选项中默认的Default(GBK)选项更改为Other,并将值设为utf-8: 2.进入Window--Preferences--MyEclipse--Files and Editors,将这个选项下面的:ASP and PHP.CSS.DTD.HTML.JSP.XML中的字符编码全部更改为utf-8: 3.如果有必

python 编写 SQLSERVER,ORACLE,MYSQL 数据查询及插入数据

SQLSERVER方法: 插入数据代码演示(上下文管理器方法): import pymssql,uuidfrom class_area.class_ReadConf import ReadDate #导入读取配置文件模块方法sql_data=ReadDate('sqlserver.conf','DATABASE','config').readdata() read_data=ReadDate('area.conf','AREAS','config').readdata()area_read_2=

mysql数据校验之字符集问题

场景:主库DB:utf8字符集备库DB:gbk字符集 需求:校验主备数据是否一致,并且修复 校验过程:设置主库连接为utf8,设置备库连接为gbk,分别进行查询,将返回的的结果集按记录逐字段比较. 显示结果:原本相同的汉字字符,数据校验认为不一致. 原因分析:对于主库而已,由于建立连接的字符集为UTF8,则返回的汉字字符编码为UTF8格式:对于备库而言则是GBK格式,而程序中通过字符串比较函数strcasecmp进行比较,显然不同的字符集编码,相同的字符有不同的二进制,因此结果肯定不会相等. 进

MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集

MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据库字符集.character-set-table:数据库表字符集.优先级依次增加.所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集.character-set-client:客户端的字符

MySQL数据移植中的乱码问题

MySQL数据如果从低版本的mysql向更高的版本移植的时候,若移植的数据中含有中文的数据时,很容易出现乱码问题.很多是在从MySQL4.x向MySQL5.x移植的时候出现.例如,我找了一个用mysql.4建立的表,表结构如下: CREATE TABLE `tb_bookcase` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, `Column_3` char(10) DEFAUL

python将oracle中的数据导入到mysql中。

一.导入表结构.使用工具:navicate premium 和PowerDesinger 1. 先用navicate premium把oracle中的数据库导出为oracle脚本. 2. 在PowerDesinger里找到 File -->> Reverse Engineer --->> Database 将数据库导入到模型. 3  在.PowerDesinger里找到Database"--->"Change Current DBMS" 将数据库

字符集转换引发插入乱码问题

根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect string value: '\x91;offl...' for column 'c' at row 1 重现: 1)连接MySQL字符集是UTF8 mysql --default-character-set=utf8 test 2)表结构 CREATE TABLE `abc` ( `id` int(1