【发布时间】:2015-04-30 18:29:23
【问题描述】:
表中有一个varchar(5) 类型的列,它通常包含字符串格式的数字。有时它包含一些额外的字符,例如"5 CA"。我们将该列转换为数字以进行排序,这是通过额外的查询完成的:
qs.extra(select={'pnumsort':'main_person.player_number+0'}).order_by('pnumsort', "player_number")
问题是这个查询引起的警告在我的开发者框上升级为异常,所以请求失败。警告:
Warning at /players/data/players_table/
Truncated incorrect DOUBLE value: '5 CA'
对于该玩家编号列的内容包含一些额外非数字字符的每一行都有这样的警告。神秘的是,我的开发同事同事在他的盒子上根本没有收到错误(他可能有警告,但没有升级为错误)。测试系统有错误,幸好live没有。
到目前为止我发现了什么:
如果我尝试使用
qs.extra(select={'pnumsort':'CAST(main_person.player_number AS UNSIGNED)'}).order_by('pnumsort', "player_number")或qs.extra(select={'pnumsort':'CONVERT(main_person.player_number, UNSIGNED)'}).order_by('pnumsort', "player_number"),我会收到相同的警告。而且由于警告,它仍然会导致我的系统出错。有一张 Django 票可以追溯到 5 年前:https://code.djangoproject.com/ticket/12293 如果在 Django Python 应用程序中打开调试模式,这种行为(MySql 警告升级为错误)似乎是正常的。但是为什么我的同事没有收到错误呢?
-
该行为似乎不依赖于 MySql 版本、Django 版本或 MySql-python 版本。
box | MySql version | MySql python version | Django DEBUG | problemmy box | 5.6.24 | 1.2.5 final | True | Yescolleague | 5.1 | 1.2.3 final | True | Notest | 5.5.38 | 1.2.3 final | True | Yeslive | 5.5.x | 1.2.5 final | False | No 我尝试关闭 MySQL 严格模式(尽管不建议这样做)。我的同事在他的
sql_mode(MySql 配置设置Disabling MySQL Strict Mode)中没有设置任何内容。清除sql_mode也无济于事,尽管有趣的是PyCharm数据库连接视图告诉它为其会话选择了STRICT 模式(SELECT @@SESSIon.slq_mode)。但是 PyCharm 使用 JDBC 连接 MySQL,所以它与 Django 和 MySQL-python 完全不同。
如何避免我的机器和测试服务器上的错误(由于 MySQL 警告)?为什么我的同事没有这个问题?
服务器是 Linux,开发环境是 Windows。
【问题讨论】:
标签: python mysql django mysql-python