【问题标题】:Querying a string from int column?从 int 列查询字符串?
【发布时间】:2013-05-30 02:31:45
【问题描述】:

我有一张桌子:

CREATE TABLE `ids` (
    id int(11) not null auto_increment,
    PRIMARY KEY (id)
);

它包含一些 ID:111、112、113、114 等。

我做了一个查询:

SELECT * FROM `ids` WHERE id = '112abcdefg'

我没有预料到,但我得到了一个结果,一行 ID 为 112。似乎 MySQL 悄悄地将我的字符串转换为整数,然后将其与列值进行比较。

如何更改查询,以便从 id 列查询相同的字符串不会得到预期的结果? MySQL中有严格的比较修饰符吗?

【问题讨论】:

标签: mysql


【解决方案1】:

一种选择是CAST 112CHAR 以获得正确的匹配:

WHERE CAST(id AS CHAR(12)) = '112abcdefg'

CHAR 中的12 是一个猜测;它应该足以容纳您最大的id

这可能会扼杀任何优化的机会,因此另一种选择(尽管我不是 100% 肯定)是使用BINARY 比较。我已经尝试了几个不同的值并且它有效:

WHERE BINARY id = '112abcdefg'

【讨论】:

  • 我认为正确的用法是cast(id as char(12))
  • 感谢@chuex 的收获——一个“分心打字”的案例:)
  • +1 你刚刚打败了我。我一直试图转换为 varchar,但它一直在抱怨。 (我不是 MySQL 人)。
【解决方案2】:

您正在比较一个字符串,只需输入不带引号的数字:

SELECT * FROM `ids` WHERE id = 112

如果你不这样做,它会将字符串 '112abcdefg' 转换为一个数字并说它的 112

您看到的响应是因为您尝试将整数列与字符串值进行比较。在这种情况下,MySQL 会将字符串文字值类型转换为整数,并且当它这样做时,它会从字符串的左侧开始,一旦到达不能被视为数字一部分的字符,它就会删除从那时起的一切。因此,尝试将“256abcd”与整数列进行比较将导致实际比较数字 256。

因此,您的选择(或至少其中一些)将是: 验证应用程序代码中的输入字符串,如果它不是整数则拒绝它(请参阅 PHP 中的 ctype_digit 函数)。 如果要将文件名视为字符串(例如 VARCHAR 类型),请更改文件名的列类型。 将列值转换为字符串:

. . . WHERE CAST(Id AS CHAR) = '256aei'

Source

【讨论】:

  • 你可能误解了我的问题。
  • 所以你假装比较一个int和一个字符串并得到结果? SQL 正在解析该字符串,当它应该崩溃时说它是错误的。
  • 恰恰相反,我不想得到任何结果,但它给了我结果。
【解决方案3】:

你可以用这个:

SET sql_mode = STRICT_TRANS_TABLES;

这会将您的 sql 模式设置为严格检查,然后尝试触发您提到的查询。

【讨论】:

  • 我会试试这个,但我更喜欢查询级的解决方案,不想弄乱整个应用程序。
【解决方案4】:

蹩脚+扼杀优化,但达到目的

SELECT * FROM `ids` WHERE concat(id) = '112abcdefg';

这样你强制转换为字符串 http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多