Python程序中使用SQLAlchemy时出现乱码的解决方案


Posted in Python onApril 24, 2015

今天对clubot进行了升级, 但是导入数据后中文乱码, 一开是找资料说是在创建引擎的时候添加编码信息:

engine = create_engine("mysql://root:@localhost:3306/clubot?charset=utf8")

但是这并不行, 然后查看表信息:

> show create table clubot_members;
clubot_members | CREATE TABLE `clubot_members` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `email` varchar(100) DEFAULT NULL,
 `nick` varchar(50) DEFAULT NULL,
 `last_say` timestamp NULL DEFAULT NULL,
 `last_change` timestamp NULL DEFAULT NULL,
 `isonline` int(11) DEFAULT NULL,
 `join_date` timestamp NULL DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `email` (`email`),
 UNIQUE KEY `nick` (`nick`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1;

发现原来创建表的时候用的latin1编码, 而老的表是用utf-8编码创建的, SQLAlchemy中并没有发现有创建表时指定指定编码的方法. 所以只能在MySQL本身来找:

> show VARIABLES like "character%%";
+--------------------------+-----------------------------+
| Variable_name      | Value            |
+--------------------------+-----------------------------+
| character_set_client   | utf8            |
| character_set_connection | utf8            |
| character_set_database  | latin1           |
| character_set_filesystem | binary           |
| character_set_results  | utf8            |
| character_set_server   | latin1           |
| character_set_system   | utf8            |
| character_sets_dir    | /data/share/mysql/charsets/ |
+--------------------------+-----------------------------+
8 rows in set (0.00 sec)

> show create database clubot;
+----------+-------------------------------------------------------------------+
| Database | Create Database                          |
+----------+-------------------------------------------------------------------+
| clubot  | CREATE DATABASE `clubot` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

发现 MySQL默认的和数据库都是latin1的编码, 所以更改数据库配置

vi /etc/mysql/my.cnf      # MySQL配置文件在Ubuntu上的位置, 其他系统可能有差异

分别在[client] [mysqld]下添加

default-character-set = utf8

这时重启MySQL居然起不来, 说default-character-set是无效的变量, 查看MySQL版本发现是5.5, 找资料说5.5的服务端编码设置变量是character-set-server, 所以将[mysqld]上的default-character-set = utf8改为 character-set-server = utf8, 并重启MySQL

然后更改数据库编码:

alter database clubot character set utf8;

删除新建的表, 并重新导入数据中文就正常了

> use clubot;

> drop table clubot_status;

> drop table clubot_infos;

> drop table clubot_history;

> drop table clubot_members;
Python 相关文章推荐
Python 可爱的大小写
Sep 06 Python
部署Python的框架下的web app的详细教程
Apr 30 Python
Python手机号码归属地查询代码
May 04 Python
Python 实现数据库更新脚本的生成方法
Jul 09 Python
Python 将pdf转成图片的方法
Apr 23 Python
python清除函数占用的内存方法
Jun 25 Python
python使用epoll实现服务端的方法
Oct 16 Python
python列表推导式入门学习解析
Dec 02 Python
python随机模块random使用方法详解
Feb 14 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
python内置进制转换函数的操作
Jun 02 Python
简单说明Python中的装饰器的用法
Apr 24 #Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 #Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 #Python
解决Python中由于logging模块误用导致的内存泄露
Apr 23 #Python
粗略分析Python中的内存泄漏
Apr 23 #Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 #Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 #Python
You might like
zf框架db类的分页示例分享
2014/03/14 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
Javascript----文件操作
2007/01/18 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
浅谈js原生拖放
2016/11/21 Javascript
js实现消息滚动效果
2017/01/18 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
详解Python中的条件判断语句
2015/05/14 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
简单说下OSPF的操作过程
2014/08/13 面试题
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
四好少年事迹材料
2014/01/12 职场文书
敬老院标语
2014/06/27 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python