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实现向ppt文件里插入新幻灯片页面的方法
Apr 28 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
用不到50行的Python代码构建最小的区块链
Nov 16 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
详解Python 切片语法
Jun 10 Python
python实现批量nii文件转换为png图像
Jul 18 Python
Django中URL的参数传递的实现
Aug 04 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
flask项目集成swagger的方法
Dec 09 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
桌面中心(一)创建数据库
2006/10/09 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
php中cookie的使用方法
2014/03/29 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
php图像验证码生成代码
2017/06/08 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
跟老齐学Python之集合(set)
2014/09/24 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
Python解析json代码实例解析
2019/11/25 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
Linux的主要特性
2014/10/06 面试题
Java如何支持I18N?
2016/10/31 面试题
执行总经理岗位职责
2014/02/03 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书