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