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不带重复的全排列代码
Aug 13 Python
windows下添加Python环境变量的方法汇总
May 14 Python
Python工厂函数用法实例分析
May 14 Python
python常用函数与用法示例
Jul 02 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
Pytorch之parameters的使用
Dec 31 Python
基于python监控程序是否关闭
Jan 14 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 Python
numpy实现RNN原理实现
Mar 02 Python
Python实现socket库网络通信套接字
Jun 04 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
轻松修复Discuz!数据库
2008/05/03 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
php中error与exception的区别及应用
2014/07/28 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
javascript截取字符串小结
2015/04/28 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
python的常见命令注入威胁
2013/02/18 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
python的json包位置及用法总结
2020/06/21 Python
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
四年大学生活的个人自我评价
2013/12/11 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
运动会通讯稿400字
2014/01/28 职场文书