heat
V2EX  ›  问与答

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

  •  
  •   heat · Sep 11, 2015 · 3186 views
    This topic created in 3923 days ago, the information mentioned may be changed or developed.
    RT ,我需要他搜不出 ID=1 的条目才对,这个要怎么解决
    9 replies    2015-09-12 00:37:33 +08:00
    tsunli
        1
    tsunli  
       Sep 11, 2015
    id != 1 ?
    altchen
        2
    altchen  
       Sep 11, 2015
    id 是 bigint 的吧?为什么要 where 字符类型?应该在程序用正确的类型
    996635
        3
    996635  
       Sep 11, 2015
    要看你的 id 的 类型, 如果不是 varchar 就会有问题
    caoyue
        4
    caoyue  
       Sep 11, 2015
    @altchen
    @996635

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

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