zoukankan      html  css  js  c++  java
  • utf8_client_read_mysql_table_in_latin1

    utf8客户端读取_latin1编码的mysql表

    转载注明来源: 本文链接 来自osnosn的博客,写于 2020-09-06.

    以下提到的编码问题,mysql 和 mariadb 是一样的解决办法。

    背景环境

    • 早期创建的mysql table 表缺省编码 default charset=latin1
    • 表中写入的中文是 gbk 编码的。
    • mysql 中 查看表的缺省编码 show create table tb_name
      最后一行 DEFAULT CHARSET= 就是表的编码格式。

    mysql client

    • 因为终端是 utf8 的,用 mysql 命令连接数据库后,查询结果,中文是乱码。
      • 解决办法,先执行 set names latin1 即可。

    python2/MySQLdb, python3/mysqlclient

    • 连接数据库指定参数 charset, use_unicode
      • db=MySQLdb.connect(host='localhost', ... ,charset='latin1',use_unicode=False)
        查询返回的值,全是 bytes 类型的。只需 加上 result.decode('utf8') 中文就能正常显示了。
    • use_unicode=True , 返回的是 str 类型
    • use_unicode=False , 返回的是 bytes 类型

    python2/MySQLdb, python3/mysqlclient 读各种编码组合。

    • 实际写入内容的编码是utf8 , 表的default charset=utf8 。
      • charset='utf8',use_unicode=Trueconnect(),返回的是str类型,中文编码正确,是utf8。
      • charset='utf8',use_unicode=Trueconnect(),从utf8文件中,以open(..,'r')模式读入的str,用db.literal()处理正常。
    • 实际写入内容的编码是latin1 , 表的default charset=utf8 或 latin1 。
      • charset='latin1',use_unicode=Trueconnect(),返回的是str类型,一定会出错。
      • charset='latin1',use_unicode=Falseconnect(), 返回的是 bytes 类型, 再decode('utf8'),得到utf8编码的str。
      • charset='latin1',use_unicode=Falseconnect(),从utf8文件中,以open(..,'r')模式读入的str,用db.literal()处理出错(解码错误)。自己先解码db.literal(s.encode('utf8')),处理OK。用非标准函数 db.escape_string()也OK。
      • charset='latin1',use_unicode=Falseconnect(),从utf8文件中,以open(..,'rb')模式读入的bytes,用db.literal()处理正常。
    • 实际写入内容的编码是utf8 , 表的default charset=latin1 。
      • 没测试,不知道。
    • 如果不想断开连接,可以执行SQL set names utf8 或者 set names latin1 转换 charset.
      或者用 connection.set_character_set('utf8')方法 转换。

    转载注明来源: 本文链接 来自osnosn的博客.

  • 相关阅读:
    Antlr与Regex
    c_str()
    C++ 友元
    C++ 操作符重载
    Remote 'attachhome' failed on nodes:XXX
    RAC安装GI时运行root.sh脚本结果
    clscfg.bin: error while loading shared libraries: libcap.so.1:
    RAC安装重新运行root.sh
    libXext.so.6 libXp.so.6 libXt.so.6 is needed by openmotif21-2.1.30-11.el7.i686
    向数据库中导入AWR数据
  • 原文地址:https://www.cnblogs.com/osnosn/p/13636739.html
Copyright © 2011-2022 走看看