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封装对象实现时间效果
Apr 23 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
Python中if elif else及缩进的使用简述
May 31 Python
python使用turtle库绘制树
Jun 25 Python
Python实现的特征提取操作示例
Dec 03 Python
Python实现打包成库供别的模块调用
Jul 13 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 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
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
Python从MP3文件获取id3的方法
2015/06/15 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
params有什么用
2016/03/01 面试题
致标枪运动员广播稿
2014/02/06 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
生产厂长岗位职责
2014/02/21 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
环境工程专业自荐信
2014/03/03 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
公司开会通知
2015/04/20 职场文书
八月一日观后感
2015/06/10 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
python数据处理之Pandas类型转换
2022/04/28 Python