最近在公司碰到一个异常蛋疼的情况,mysql数据库中,数据库和表的字符集都是'gbk',但是列的字符集却是'latin1',于是蛋疼的事情出现了。

无论我连接字符串的`charset`设置为`gbk`,`utf8`,`latin1`中的任意一种,查询出来的表中数据的中文都是乱码,在查询中加上如下代码也还是无济于事:

 SET NAMES latin1 
 
在更换各种py链接库,然后疯狂的google和问了各路大神之后,终于找到解决思路如下:
1、通过hex(column)将列中的数据2进制转为16进制字符串表示,然后返回给py
2、py通过2次decode操作,将hex字符串转为Unicode编码
3、最后进行一次encode,将结果转为utf8响应出去
伪代码如下:
def hex2char(hexString):
output = hexString.decode('hex').decode('gbk').encode('utf8')
return output
...
sqlStr = "SELECT acc_name,level_n,hex(char_name) FROM roles where acc_name='noc20'"
cur.execute(sqlStr)
for c in cur:
char_name = hex2char(c[2])
...

最后分析一下为什么之前,设置charset='gbk',然后对查询结果直接decode('gbk')无法操作的原因,因为数据库字符集和表的字符集都是`gbk`,所以数据库链接我们这里必须设定为`gbk`,但是由于我们需要获取的列名字符集被坑爹的设置成`latin1`,所以查询返回的字符串其实就是以`latin1`编码的,实质上是`gbk`的字符串,当然使用任意一种decode都是无法正确转换的,只有将字符串转为2进制表示,才能无损的从数据库读出数据,而`hex`操作正巧帮我们无损的从数据库将数据读出,然后就顺利成章的进行2次decode,最后获得我们需要的字符串,最后再次谴责哪个坑爹设计了这样的数据库。

解决mysql中表字符集gbk,列字符集Latin1,python查询乱码问题的更多相关文章

  1. 解决MySQL联表时出现字符集不一样

    mysql 建表时都会设置表的字符集和排序规则,通常是 utf8,不过我这边习惯建表的字符集是 utf8mb4,排序规则是 utf8mb4_unicode_ci.有些 utf8mb4 的表默认排序规则 ...

  2. 解决mysql无法插入中文数据及插入后显示乱码的问题

    (1)废话不多说就是使用mysql数据库的时候无法输入中文,可以输入中文后显示的又是乱码!! (2开始解决问题: 第一步:找到安装mysql的目录找到 my.ini 文件: 第二步:使用记事本打开my ...

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

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...

  4. mysql 表及其列字符集设置

    --修改表的字符集 alter table rtb_media_daily_report character set gbk; --查询表列字符集 show full columns from rtb ...

  5. 查看mysql字符集及修改表结构--表字符集,字段字符集

    MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...

  6. mysq查询语句包含中文以及中文乱码,字符集 GBK、GB2312、UTF8的区别

    一.查看mysql 字符集设置情况 使用Navicat for Mysql查看工具,打开命令列界面,输入show variables like '%char%';如下图,查看当前mysql字符集设置情 ...

  7. 设置MySQL客户端连接使用的字符集

    设置MySQL客户端连接使用的字符集 时间:2014-03-05    来源:服务器之家    投稿:root 考虑什么是一个"连接":它是连接服务器时所作的事情.客户端发送SQL ...

  8. mysql 开发基础系列14 字符集

    字符集是一套文字符号及其编码,比较规则的集合.第一个字符集是ascll(american standard code for information interchange).  1.  选择合适的字 ...

  9. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

随机推荐

  1. 一个简单的XML与数组之间的转换

    xml是网络使用最多的数据交换格式,所以,不掌握怎么操作它,又有蛋疼的了. php中可以操作xml的类/函数很多,个人认为最简单的是SimpleXMLElement这个类,它的使用就跟其名字一样:简单 ...

  2. jquery学习--选择器

    选择器:basic $('button') html 标签 $('#test') 标签ID $('.test') 标签的class $('.test,#test,h1') 多选用逗号隔开 $('*') ...

  3. JDBC之修改数据

    文件分布图: 在MySQL中设置表格: Books: package com.caiduping.entity; public class Books { private int id; // 图书名 ...

  4. 给 Android 初学者的 Gradle 知识普及

    给 Android 初学者的 Gradle 知识普及:http://gold.xitu.io/entry/5778f8bd165abd0054b443b0/promote?utm_source=bai ...

  5. C++函数模板本质-学习入门

    template<typename T> void mySwap(T &a, T &b) { T c; c = a; a = b; b = c; } int main() ...

  6. 字符串转与ASCII码之间的互换

    1.字符串转换成ASCII码 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuffe ...

  7. pickle模块的基本使用

    pickle是python的biult-in模块: python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储 ...

  8. extends 与 implements 的区别

    extends与implements是Java继承中使用的两个关键字,但extends与implements使用的情景不同: 1.接口继承接口,使用extends 2.类继承类时,用extends 3 ...

  9. The C in C++

    1 unnamed arguments in the argument list of the function definition (Page 114) In c++, an argument m ...

  10. 1_jz2440在linux下烧写裸机程序

    常用的烧写方法有: 1.使用并口工具烧写:接线(参考百问网JZ2440V2开发板使用手册),使用oflash烧写(速度比较慢),可烧写.bin文件,从新上电观察效果.可烧写u_boot. 2.使用op ...