昨天郁闷了一个晚上,今天早上终于灵光闪现,把问题解决了。
在一个页面上需要给用户提供搜索功能,本来用dbi里面的contains方式就挺好用的,而且中文支持也没有问题。后来因为这个页面是分页的,因此用户提出想要一个汇总数据,于是加上一条自定义的SQL汇总语句,结果,这个语句里面的like '%%'始终就是过不去。要么提示参数不足,要么提示解码错误,说什么ascii编码无法处理特殊字符。
改来改去,试了N多次,都没有解决问题。我觉得自己构造的SQL应该没有问题啊,后来发现,问题很可能出现在那个cursor.execute里面。于是根据错误提示,来到django的代码里,/site-packages/Django-0.95-py2.5.egg/django/db/backends/util.py,给页面的顶部加上#coding=utf-8,OK,错误提示变了,跳到了MySqldb里去。于是再改/site-packages/MySQLdb/cursors.py,给它也加上#coding=utf-8,结果还是不对,仍然提示ascii编码转换错误。
根据错误提示,在这个文件的147行,有一句对查询进行编码的动作,它的编码标准是
# charset = db.character_set_name()
# query = query.encode(charset)
按理说db拿到的编码应该是utf8的,不知道为什么总是会得到ascii编码,导致编码错误,于是将这两行注释掉,查询终于可以通过了。还不知道会不会有什么负作用。
4月24日修正:安装了Django 0.96和Mysqldb1.2.2以后,这个问题好像不存在了。