最近在公司碰到一个异常蛋疼的情况,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. Qt之读取配置文件

    一.读取配置文件增删功能与修改参数数据 #ifndef CONFIG_H #define CONFIG_H #define QS_FILEPATH "E:\\woo\\Code\\Qt\\A ...

  2. 写代码的心得,怎么减少编程中的 bug?

    遭遇 bug 的时候,理性的程序员会说:这个 bug 能复现吗? 自负型:这不可能,在我这是好好的. 经验型:不应该,以前怎么没问题? 幻想型:可能是数据有问题. 无辜型:我好几个星期都没碰这块代码了 ...

  3. css3 颜色记

    css3 颜色 opacity 使元素呈现出半透明效果. opacity:alphavalue || inherit alphavalue:默认值为1,可以取0~1任意浮点数.取值为1时,元素完全不透 ...

  4. MySQL之经典语句

    数据库的创建:(例如创建名为ConstructionDB的数据库) --创建SelfStudy数据库 CREATE DATABASE ConstructionDB ON PRIMARY --创建主数据 ...

  5. JAVA之While语句、Do和For语句

    先看While语句和Do While语句,它们有着相同之处,但是也有区别.下面示例While语句.Do While语句和For语句(运行结果是相同的): While语句: public class w ...

  6. CSS有用的代码片段

    1.垂直对齐 .vc{ position:relative; top:50%; -webkit-transform:translateY(-50%); -o-transform:translateY( ...

  7. 在swift中使用oc 的代码

    就是需要一个桥文件, 方法一:在swift项目中,新建一个oc的类,这时候,会弹出一个对话框,你点默认的那个选项就行了.然后在新生成的桥文件中导入你所需要的oc代码的头文件就行了. 方法二:但是有时候 ...

  8. Php 操作事务

    PHP来操作数据库 关于事务操作 连接数据 mysql_connect('localhost','root','123'); 设置字符集 mysql_query('set names utf8'); ...

  9. Kernel Panic常见原因以及解决方法

    Technorati 标签: Kernel Panic 出现原因 1. Linux在中断处理程序中,它不处于任何一个进程上下文,如果使用可能睡眠的函数,则系统调度会被破坏,导致kernel panic ...

  10. 重学C++ (1)

    写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...