Querying a string from int column?

前端 未结 4 1851
眼角桃花
眼角桃花 2020-12-20 17:55

I have a table:

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

It contains some IDs: 111, 112, 113, 1

相关标签:
4条回答
  • 2020-12-20 18:21

    You are comparing a string, just put the number with no quotes:

    SELECT * FROM `ids` WHERE id = 112
    

    If you dont, it will convert the string '112abcdefg' to a number and say its 112

    The response you are seeing is because you are trying to compare an integer column to a string value. In that case, MySQL will type-cast the string literal value to an integer, and when it does that it starts from the left of the string and as soon as it reaches a character that cannot be considered part of a number, it strips out everything from that point on. So trying to compare "256abcd" to an integer column will result in actually comparing the number 256.

    So your options (or at least a few of them) would be: Validate the input string in your application code and reject it if it's not an integer (see the ctype_digit function in PHP). Change the column type for the filename if you want to treat it as a string (e.g. a VARCHAR type). Cast the column value to a string:

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

    Source

    0 讨论(0)
  • 2020-12-20 18:31

    you can use this :

    SET sql_mode = STRICT_TRANS_TABLES;
    

    this sets you sql mode to strict checking, and then try firing the query you mentioned.

    0 讨论(0)
  • 2020-12-20 18:33

    One option is to CAST the 112 to CHAR to get a proper match:

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

    The 12 in CHAR is a guess; it should be large enough for your biggest id.

    That will probably kill any chance of optimization, so another option (though one I'm not 100% sure of) is to use a BINARY comparison. I've tried this with a few different values and it works:

    WHERE BINARY id = '112abcdefg'
    
    0 讨论(0)
  • 2020-12-20 18:46

    lame + kills optimization but serves it purpose

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

    that way you enforce casting to string http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

    0 讨论(0)
提交回复
热议问题