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的博客.

原文地址:https://www.cnblogs.com/osnosn/p/13636739.html