Python MySQL 1054 "Unknown column '\xe7\x88\xb1\xe6\x83\x85' in 'where clause'"错误分析

环境版本:

Python 2.7

MySQL 5.6.27

测试逻辑为:采用带有参数的SQL语句的书写格式,实现修改指定电影类型的状态标识位;

数据表的字段设计如下图所示(数据表的编码格式为utf-8):


在执行如下命令:


则会报1054错误提示,如下图所示:



分析:

根据错误提示不难看出,是因为没有在数据表中找到字段‘\xe7\x88\xb1\xe6\x83\x85’;因为数据表的编码是utf-8,那么问题很显然就出在了Python的编译阶段(具体原因和底层实现还在探究中,若有知道的,可直接在评论区赐教吐舌头)。

解决办法:

方式一:用“%”的格式改写上述SQL语句,具体实现为:sql  = "update test set state='%s' where tag='%s'" % (-1, s)

方式二:若仍想采用format的格式,则需要对字符串增加单引号,具体实现为:sql = 'update test set state={0} where tag={1}'.format(-1, "'" + s + "'")或sql = 'update test set state={0} where tag={1}'.format(-1, '\'爱情\'')


可通过debug模式分析这三种sql语句的编译结果,证明之前分析的正确性(问题出在Python的编译阶段)和具体的解决办法。

debug模式的截图如下:


sql为错误的写法,sql1和sql2分别为两种不同的正确写法;

对于Python编译器编译字符串和此处涉及到的双反斜杠来实现引号转译的原理目前还不是很了解,日后会加以补充。若有知道的各路大牛,还请不吝赐教;对上述有理解不到位的地方,也欢迎指出。

猜你喜欢

转载自blog.csdn.net/yhyr_ycy/article/details/73740064