【问题标题】:mysql Max behaviour with numeric vals in varchar fieldmysql Max 行为与 varchar 字段中的数值
【发布时间】:2011-09-05 10:31:03
【问题描述】:

我们有一个包含键和值的数据库表,其中值可以是 varchar 字段中的任何值。这些值是关于一个项目的属性,一个属性是价格。

为了为价格创建一个选择字段,我使用Max() 函数在价值列中找到似乎有效的最大值。

然后,当我们得到超过 100 英镑的价格时,它们开始没有作为最大值返回。我理解这是因为它是一个字符串值而不是数字。

运行select max(value) from attributes where value > 100 之类的命令时会出现混淆,因为现在该语句识别出 101 > 100 但 99 不是因此返回 101 作为最大值,但是如果没有 where value > 100 子句,99 被视为 > 101 . 为什么 > 100 子句可以作为数字比较而 max 不能?

发生这种情况有什么原因吗?

【问题讨论】:

  • varchar to number conversion for sorting in MySQL 的可能副本。不要将 varchar 与 numeric 混合,你可以这样做 max( cast(value as unsigned) ) 但并不理想
  • 非常感谢伙计,如果您将其放入答案中,我可以接受。或者我应该关闭这个问题,因为它几乎是重复的。你知道为什么 > 子句有效吗?这才是问题的真正原因。
  • @Luke 没有类型转换 > 子句也不起作用。试试:select '1000' > '99'
  • 这条语句:select max(value) from attributes where value > 100 确实有效,这让我们感到困惑,但 select max(value) from attributes where value > 50 没有,它仍然选择了 99 作为最大值。

标签: mysql max


【解决方案1】:

不要将 varchar 与数字混合,
想法解决方案仅存储用于 max 聚合函数的数字,
或者

max( cast(value as unsigned) )

当您执行MAX 时,会强制转换为字符串。
当您进行比较时,是转换为数字。

原因?
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_max
(返回最大字符串值)

【讨论】:

  • 除非已应用报价?
  • 哦,我想到了一般的字符串比较。在这种情况下,> 子句中的一个操作数是一个数值,因此第二个操作数会自动转换为数值。对不起,你是对的。我不专心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2010-12-12
  • 2011-09-15
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多