使用MySQL 5.5.60。
在Mysql中运行select查询时,我遇到了一些奇怪的行为。我有一个表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
它仍然返回list 1946
!显然,MySQL以某种方式摆脱了dhkdf
部分,只使用了1946
部分。那么,它是否会尝试将该值转换为Integer呢?那么为什么这个查询返回空集呢?
mysql> select * from list where list_id = "xq1946dhkdf"\G
我似乎找不到任何可以解释这种行为的文档。有人能解释一下吗?
发布于 2020-11-26 12:45:41
您可以看到MySQL的一些复杂的强制转换规则在这里起作用。当尝试将整型列与字符串文字进行比较时,必须将其中一个转换为整型,或者将另一个转换为字符串。在这种情况下,MySQL将尝试将字符串转换为整数,以匹配列的类型。但是,在这种情况下,它不能将整个字符串转换为整数,因为它包含字符。因此,强制转换规则生效,该规则规定,如果字符串的前N个字符是数字,则只使用该前导数字。因此,以下查询的结果是:
select * from list where list_id = "1946dhkdf";
将返回与以下相同的结果集:
select * from list where list_id = "1946";
https://stackoverflow.com/questions/65016165
复制相似问题