【问题标题】:MySQL results issue when the value has number ending with string当值的数字以字符串结尾时,MySQL结果问题
【发布时间】:2019-01-04 10:56:31
【问题描述】:

谁能指出这种行为并阻止这种行为?

我知道转换或添加双引号。

我想知道有没有其他方法

继承表定义

CREATE TABLE `countries` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `country_name` varchar(100) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1

id为1的记录正确,但id为2的记录不满足where条件被返回。

【问题讨论】:

  • 是否有任何 TABLE 定义更改可以解决此问题?
  • 不,您不必为此编写代码。
  • 告诉学说你搜索的country_name是一个字符串,不要交出一个整数
  • 不可否认,它一个国家的奇怪名字

标签: mysql sql select casting conditional-statements


【解决方案1】:

问题是,当您编写 country_name = 7884 时,country_name 被隐式转换为 signed integer。在铸造过程中,'S' 被简单地忽略了,如您所见here。这选择了第二行,因为cast('1884S' AS signed) = 1884 = 1884(您的输入)。

正如 fa06 已经建议的那样,用单引号将操作数括起来以使其成为字符串并防止隐式转换 -- ... where country_name = '7884'

【讨论】:

  • mysql 设置级别的任何配置以防止这种自动转换?
【解决方案2】:

试试这个:

select * from countries where country_name='7884'

【讨论】:

  • 正确,就像我说的,我知道这是解决方法。但是我正在使用 Laravel(Doctrine)并且驱动程序正在触发查询。所以我想知道一个结构明智的解决方案,这样我就不必在这种情况下对每个文件/条件进行更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2023-01-27
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多