【问题标题】:Comparing string against numeric field returning unexpected results将字符串与返回意外结果的数字字段进行比较
【发布时间】:2012-06-14 02:19:48
【问题描述】:

给定表格:

CREATE TABLE IF NOT EXISTS `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

添加几行:

INSERT INTO `users` (`id`,`name`) VALUES (NULL , 'Bob'),(NULL , 'Larry'),(NULL , 'Steve');

为什么,哦,为什么!此查询是否返回结果:

SELECT * FROM `users` WHERE id = "2this-is-not a numeric value"

结果:

query returned 1 row(s) in 0.0003 sec
id  name
-----------------
2   Larry

where 子句中使用的字符串显然被转换为数值——谁说要这样做?!我找不到任何建议 mysql 或 PHP 假定自动转换我的字符串文字的文档。

这仅在数字字符是字符串中的第一个字符时才有效,"this 2 is not numeric" 不会返回结果。 "12 2" 将变为 12"1 2"(一空格二)变为 1

任何解释此行为的文章或文档将不胜感激。

【问题讨论】:

  • doens't mysql 使用 ' 而不是 " 来表示字符串?它可能只是在查看数字值尝试将其隐式转换为数字,然后截断非数字值。所以...为什么哦,为什么!:D 您是否在数值字段中使用引号来强制它进行隐式转换?不用说,我也认为这是奇怪的行为。
  • 要么。我总是用单引号来写代码,所以我总是给 sql 发送双引号
  • 我想知道如果在选择中将字符串隐式转换为 bigint 会得到什么结果。如果你得到 2... 那么这是隐式转换,我的 o my 是 ODD 行为。
  • 再一次……你为什么要使用引号?
  • 在实际代码中,查询是由一个函数组装的,该函数将所有列名包装在反引号 (`) 中,并将所有值包装在引号中。显然,这个功能不能继续使用——自动施法令人沮丧。

标签: php mysql sql


【解决方案1】:

【讨论】:

  • SELECT CONVERT( "2this-is-not a numeric value", UNSIGNED ) 返回2。也许您可以将此添加到您的答案中。
  • 不喜欢。我想要 0 个结果——没有行的 id 为“2yourmom”。当我说WHERE id = "2yourmom" 时,我的意思是 id 等于那个值。无论发生在任何语言中,自动投射都很糟糕。无论如何...感谢您的链接:D
  • +1 这说明了原因。 mysql 中的隐式转换将在 int 之后删除非数字值,然后进行隐式转换。对我来说太可怕了,但它在文档中
  • 太好了,现在我需要一个 PHP/JS-esq === 运算符,呵呵
猜你喜欢
  • 2022-01-25
  • 2021-09-04
  • 2011-04-04
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多