Python学习之Flask-SQLAlchemy乱码异常

来源:互联网 发布:淘宝店铺2017招牌图片 编辑:程序博客网 时间:2024/05/17 22:08

问题

在学习使用flask + SQLAlchemy 定制一个web查询页面的demo ,在测试时,发现查询到的结果显示乱码 。这里将解决方法记录下。


二、解决思路

1、flask 程序上定位

flask的文档中提到可以通过设置SQLALCHEMY_NATIVE_UNICODE来禁止使用SQLAlchemy默认的Unicode编码。
有可能是SQLAlchemy默认的Unicode编码不是UTF-8,抱着这样的想法,在程序中指定了“SQLALCHEMY_NATIVE_UNICODE=False”,执行程序,报错。
flask中还提到“use_native_unicode”为目标编码来指定编码方式,
尝试将“db = SQLAlchemy(app)”,改为“db = SQLAlchemy(app, use_native_unicode=”utf8″)”。## 标题 ##这回虽然没报错,但还是乱码。


2、mysql 上定位

突然想到有可能是建表的时候,没有指定字符集,使用的是数据库默认的字符集的导致的。继续找了一段时间的如何指定建表时使用字符集的方法,未果。
数据库该不会使用的不是UTF-8吧?抱着这个想法,进入数据库,输入“status”,在输出的信息上显示默认是latin-1。搞了半天,原来问题在这。

mysql> statusmysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1Connection id: 9Current database: web12306Current user: root@localhostSSL: Not in useCurrent pager: stdoutUsing outfile: ''Using delimiter: ;Server version: 5.1.73 Source distributionProtocol version: 10Connection: Localhost via UNIX socketServer characterset: utf8Db characterset: utf8Client characterset: latin1Conn. characterset: latin1UNIX socket: /var/lib/mysql/mysql.sock

3、解决问题

即然找到了,问题就在mysql 的my.cnf 上增加相关配置,并重启mysql 服务:

进入mysql的配置文件目录cd /etc/mysql/编辑my.cnf配置文件vim my.cnf在文件中的[mysqld]下面增加一行内容character_set_server = utf8在[client]和[mysql]下面分别增加一行内容default-character-set = utf8保存。然后重启MySQL的服务,设置就生效了service mysqld restart

注:需要注意的是,之前已经存在的数据,在上面修改过后,通过mysql select查询时会是乱码,需要重新导入