在MySQL中用字符串查询Int字段的奇怪行为



使用MySQL 5.5.60。

在Mysql中运行选择查询时,我遇到了一些特殊的行为。我有一个表list,它的模式如下:

+-----------------------+--------------+------+-----+-----------------+----------------+
| Field                 | Type         | Null | Key | Default         | Extra          |
+-----------------------+--------------+------+-----+-----------------+----------------+
| list_id               | int(11)      | NO   | PRI | NULL            | auto_increment |
| vendor_id             | int(11)      | NO   | MUL | NULL            |                |
| referrer_id           | int(11)      | NO   |     | 0               |                |
...

如果我运行这个查询

mysql> select * from list where list_id = "1946"G

一切正常,返回id为1946的列表。这就是它变得奇怪的地方。如果我把我的查询改成这样:

mysql> select * from list where list_id = "1946dhkdf"G  

它仍然返回列表1946!很明显,MySQL在某种程度上抛弃了dhkdf部分,只使用了1946部分。那么,它是否试图以这种方式将该值强制转换为Integer?为什么这个查询返回空集?

mysql> select * from list where list_id = "xq1946dhkdf"G 

我似乎找不到任何解释这种行为的文档。有人能解释一下吗?

您可以在这里看到MySQL有些复杂的强制转换规则。当试图将整数列与字符串文字进行比较时,必须将其中一个强制转换为整数,或者将另一个强制为字符串。在这种情况下,MySQL将尝试将字符串文字强制转换为整数,以匹配列的类型。但是,在这种情况下,它不能将整个字符串文字强制转换为整数,因为它包含字符。因此,强制转换规则开始生效,该规则规定,如果字符串的前N个字符是数字,则只使用该前导数字。因此,结果是以下查询:

select * from list where list_id = "1946dhkdf";

将返回与相同的结果集

select * from list where list_id = "1946";

相关内容

最新更新