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中使用HTML模版的教程
Apr 29 Python
python调用fortran模块
Apr 08 Python
Python基础知识_浅谈用户交互
May 31 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
Python3.6连接Oracle数据库的方法详解
May 18 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
Python函数参数定义及传递方式解析
Jun 10 Python
Python 绘制可视化折线图
Jul 22 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 Python
用Python将库打包发布到pypi
Apr 13 Python
python实现简单区块链结构
Apr 25 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
PHP脚本的10个技巧(8)
2006/10/09 PHP
php 应用程序安全防范技术研究
2009/09/25 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
深入理解node.js http模块
2018/01/24 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
老生常谈python中的重载
2018/11/11 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
六道php面试题附答案
2014/06/05 面试题
渔夫的故事教学反思
2014/02/14 职场文书
班干部演讲稿
2014/04/24 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
党的群众路线调研报告
2014/11/03 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python