一、问题

这两天在学习使用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。搞了半天,原来问题在这。

 1mysql> status
 2--------------
 3mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
 4Connection id:          9
 5Current database:      web12306
 6Current user:           root@localhost
 7SSL:                    Not in use
 8Current pager:          stdout
 9Using outfile:          ''
10Using delimiter:        ;
11Server version:         5.1.73 Source distribution
12Protocol version:       10
13Connection:             Localhost via UNIX socket
14Server characterset:    utf8
15Db     characterset:    utf8
16Client characterset:    latin1
17Conn.  characterset:    latin1
18UNIX socket:            /var/lib/mysql/mysql.sock

3、解决问题

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

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

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

最后上个图:

Flask-SQLAlchemy