SAE用flask+MySQL中文'utf8' codec can't decode byte 0xb7解决方法

在Sina App Engine(SAE)上用python flask框架+MySQL搭app服务器时,select返回中文时jsonify函数报如下错误:(为调试放拜我异常时return的traceback.format_exc())

Traceback (most recent call last): File “/data1/www/htdocs/245/jcguo/1/myapp.py”, line 88, in searchHotel return jsonify(results = data)
……
File “/usr/local/sae/python/lib/python2.7/json/encoder.py”, line 434, in _iterencode for chunk in _iterencode_dict(o, _current_indent_level): File “/usr/local/sae/python/lib/python2.7/json/encoder.py”, line 408, in _iterencode_dict for chunk in chunks: File “/usr/local/sae/python/lib/python2.7/json/encoder.py”, line 332, in _iterencode_list for chunk in chunks: File “/usr/local/sae/python/lib/python2.7/json/encoder.py”, line 390, in _iterencode_dict yield _encoder(value) UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xb7 in position 4: invalid start byte

大概意思是jsonify时utf8解码器不能解码0xb7,我编码知识比较薄弱,但大概能猜测到是中文的问题。

遂先检查SAE上MySQL的database、table以字段的编码设置(应用管理->服务管理->MySQL),确保:

SHOW CREATE DATABASE app_jcguo;

返回:

CREATE DATABASE `app_jcguo` /*!40100 DEFAULT CHARACTER SET utf8 */

以及:

SHOW CREATE TABLE Hotels

添加了default charset:

CREATE TABLE `Hotels` (
 `id` int(11) NOT NULL,
 `name` varchar(40) DEFAULT NULL,
 `city` varchar(10) DEFAULT NULL,
 `address` text,
 `price` int(11) DEFAULT NULL,
 `total` int(11) DEFAULT NULL,
 `avail` int(11) DEFAULT NULL,
 `pic_b` varchar(40) DEFAULT NULL,
 `pic_s` varchar(40) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

并且保证要填入中文的字段都是varchar类型并且设置为utf8_general_ci:
截图

设置检查完毕但服务器还是报错,最后只好Google四处寻找解决方案。发现原来是MySQLdb.connect()还要设置一遍charset来指定cursor取数据库数据的格式:

@app.before_request
def before_request():
    g.db = MySQLdb.connect(
        MYSQL_HOST, 
        MYSQL_USER, 
        MYSQL_PASS,
        MYSQL_DB,
        port=int(MYSQL_PORT),
        charset = 'utf8'
    )

第一次用MySQL存中文,遇到此坑,遂记录在Blog上。SQLite所有操作默认都是UTF-8,TAT,老用python+SQLite就忽略了这个问题。

对了,文件头中别忘了添加编码注释:

# -*- coding:utf8 -*-
#encoding = utf-8
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Flask时,如果出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte的错误,这通常是由于编码问题引起的。一种解决方法是在打开文件时使用正确的编码方式,例如使用encoding='unicode_escape'。另一种解决方法是在代码中设置正确的字符编码,例如使用plt.rcParams['font.sans-serif'] = ['SimHei']和plt.rcParams['axes.unicode_minus'] = False来确保中文字符正常显示在图片上。如果你尝试了这些方法仍然无法解决问题,可能需要检查你的文件是否使用了其他编码方式,或者尝试更新Python的版本。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb5 in position 0: invalid start](https://blog.csdn.net/wang_ningning/article/details/112887811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Python】UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xba in position 4: invalid start ...](https://blog.csdn.net/qq_45797116/article/details/122424131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值