mysql where exact match

后端 未结 4 733
梦谈多话
梦谈多话 2021-01-14 04:47

When i write this query

SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 260;

return

title            city  
--         


        
相关标签:
4条回答
  • 2021-01-14 04:52

    This is happening because of Type Conversion in MySql. My sql treats '260abcxyz' as an integer in your query and AFAIK because first char is number MySql casts it to a number and it becomes only 260 and that's why you are getting result. If you write character first like 'abcxyz260' it will successes the comparison.

    More explanation available here: Type Conversion in MySql

    As a solution: you should take care that only numbers are passed in comparison and not combination of string and number.

    0 讨论(0)
  • 2021-01-14 04:52

    use like instead = because if the string is too long than exact match won't work in that way
    SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id LIKE '260abcxyz';

    0 讨论(0)
  • 2021-01-14 05:03

    You could convert the id to a string so the comparison will be done exactly. You could use LIKE to cause an implicit conversion

    SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id LIKE '260abcxyz';
    

    or alternative, you can perform the cast explicitly

    SELECT cd.title, cd.city FROM coupon_detail cd WHERE CAST(cd.id AS CHAR) = '260abcxyz';
    

    However, if all your IDs are integers, it's probably more appropriate to check these values before you try to query the database. (If the ID you're querying with isn't a number, there can't be a match anyway.)

    0 讨论(0)
  • 2021-01-14 05:11

    Well, you should not use quote if the id is INT. The way MySQL does is if you use String to compare a INT, it uses just the valid initial integer from start.

    see this:

    mysql> desc coupon_detail;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id    | int(11)      | YES  |     | NULL    |       |
    | title | varchar(100) | YES  |     | NULL    |       |
    | city  | varchar(100) | YES  |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    3 rows in set (0.04 sec)
    
    mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 'ff260';
    Empty set, 1 warning (0.00 sec)
    
    mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = '260ff';
    +-----------------+--------+
    | title           | city   |
    +-----------------+--------+
    | Butterfly world | Mohali |
    +-----------------+--------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 260;
    +-----------------+--------+
    | title           | city   |
    +-----------------+--------+
    | Butterfly world | Mohali |
    +-----------------+--------+
    1 row in set (0.00 sec)
    
    mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 26011;
    Empty set (0.00 sec)
    

    The idea is not to mix numbers and aphabets to compare a INT column. If you have to you may consider

    • converting ID column to VARCHAR. In that case auto-increment may go away.
    • have application logic to query only the strings that has numerics.
    0 讨论(0)
提交回复
热议问题