Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么where条件下的单引号和不带单引号时的select查询行为不同_Mysql_Sql_Plsql_Plsqldeveloper - Fatal编程技术网

Mysql 为什么where条件下的单引号和不带单引号时的select查询行为不同

Mysql 为什么where条件下的单引号和不带单引号时的select查询行为不同,mysql,sql,plsql,plsqldeveloper,Mysql,Sql,Plsql,Plsqldeveloper,我观察到在使用单引号和不使用单引号执行查询时的不同行为 使用单引号('121')我很快得到了结果,并且查询很好地使用了索引。但是如果没有单引号,查询将不使用索引,并且响应时间很长 mysql> explain select * from tbl_n1 where id =121; +----+-------------+----------------------+------+---------------+------+---------+------+--------+------

我观察到在使用单引号和不使用单引号执行查询时的不同行为

使用单引号(
'121'
)我很快得到了结果,并且查询很好地使用了索引。但是如果没有单引号,查询将不使用索引,并且响应时间很长

mysql> explain  select * from tbl_n1 where id =121;
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table                | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | tbl_n1               | ALL  | n1_id      | NULL | NULL    | NULL | 286929 | Using where |
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+
1 row in set (0.00 sec)

mysql> explain  select * from tbl_n1 where id ='121';
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table                | type | possible_keys | key      | key_len | ref   | rows | Extra       |
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | tbl_n1               | ref  | n1_id       | n1_id  | 53      | const |   29 | Using where |
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)


show create table tbl_n1\G
....
....
 `id` varchar(10)  DEFAULT NULL,
....
....
....

由于字段
id
的定义是
varchar
,如果没有单引号,数据库必须对字段
id
进行隐式转换,应用强制转换(或任何函数将其转换为varchar),这将阻止使用索引
idx_1055


阅读这篇文章:

由于字段
id
的定义是
varchar
,如果没有单引号,数据库将不得不对字段
id
进行隐式转换,应用强制转换(或任何将其转换为varchar的函数)这将阻止使用索引
idx_1055


阅读这篇文章:

我想知道为什么它不能将右边的值转换成字符串?在这种情况下,它可以使用索引。我同意仍然很奇怪。在postgres中,隐式转换将是一个常量,并且仍然使用索引。是的,它可以检查什么是最佳匹配,并进行适当的转换,以便使用索引。我猜这就是MySql的实现方式。我想知道为什么它不把右边的值转换成字符串呢?在这种情况下,它可以使用索引。我同意仍然很奇怪。在postgres中,隐式转换将是一个常量,并且仍然使用索引。是的,它可以检查什么是最佳匹配,并进行适当的转换,以便使用索引。我想这就是MySql的实现方式。