V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
heat
V2EX  ›  问与答

MYSQL 为何执行 SELECT * FROM tbl WHERE id='1-1',也能搜出来 id=1 的条目?

  •  
  •   heat · 2015-09-11 10:35:00 +08:00 · 2659 次点击
    这是一个创建于 3158 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT ,我需要他搜不出 ID=1 的条目才对,这个要怎么解决
    9 条回复    2015-09-12 00:37:33 +08:00
    tsunli
        1
    tsunli  
       2015-09-11 10:51:20 +08:00
    id != 1 ?
    altchen
        2
    altchen  
       2015-09-11 10:57:29 +08:00
    id 是 bigint 的吧?为什么要 where 字符类型?应该在程序用正确的类型
    996635
        3
    996635  
       2015-09-11 11:08:18 +08:00
    要看你的 id 的 类型, 如果不是 varchar 就会有问题
    caoyue
        4
    caoyue  
       2015-09-11 11:30:57 +08:00
    @altchen
    @996635

    其实如果 id 是 int 不是 varchar 这个语句也不会出错的
    比如可以试试 select "1-1" = 1 看看结果

    我记得 mysql 好像也是有 type conversion 的,可以查查文档
    anoymoux
        5
    anoymoux  
       2015-09-11 12:04:53 +08:00
    id 是 int 型,'1-1' 被转成了 1
    把 id 改成 varchar
    zonghua
        6
    zonghua  
       2015-09-11 12:39:59 +08:00 via iPhone
    1-1 是字符
    SoloCompany
        7
    SoloCompany  
       2015-09-11 13:51:31 +08:00
    有毛病啊
    ‘ 1-1 ’ 强制类型转换成 int ,并且是尽量容错的,就是遇到非数字就终止(减号),结果就是 1
    所以你的条件是 id=1
    heat
        8
    heat  
    OP
       2015-09-11 20:56:51 +08:00
    @caoyue
    @anoymoux
    @SoloCompany 对的, ID 是自增字段,所以是 BIGINT 类型,但是当输入 1-2 , 3-10 这种东西的时候。我希望结果并不等于 ID 1 和 3 。有办法让 MYSQL 强制数据类型么
    SoloCompany
        9
    SoloCompany  
       2015-09-12 00:37:33 +08:00
    @heat 你这是玩 hi 了吧,要是自己用,去掉引号就是了,要是在线上用,你不怕被 SQL 注入玩坏的话可以尽管试试,没有安全意识的话,加引号一样要被玩坏。正确的做法,自己做个四则运算解释器或者找现成的,计算好后再做查询
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2267 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:44 · PVG 23:44 · LAX 08:44 · JFK 11:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.