从Java的类型转换看MySQL和Oracle中的隐式转换(2)

我们来看看在MySQL中的表现。
 还是创建一个简单的表,插入一些数据。
> create table test (id1 int,id2 varchar(10));
 > insert into test values(1,'1');
 > insert into test values(2,'2');
 > insert into test values(3,'3');
 > commit;
 > create index idx_id1 on test(id1);
 > create index idx_id2 on test(id2);
这个时候生成执行计划,可以发现走了索引
> explain select * from test where id1='1';
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 | id | select_type | table | type | possible_keys | key    | key_len | ref  | rows | Extra      |
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 |  1 | SIMPLE      | test  | ref  | idx_id1      | idx_id1 | 5      | const |    1 | Using where |
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 1 row in set (0.00 sec)
而如果查看id1为varchar的类型时,也走了索引。
> explain select * from test where id1='a';
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 | id | select_type | table | type | possible_keys | key    | key_len | ref  | rows | Extra      |
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 |  1 | SIMPLE      | test  | ref  | idx_id1      | idx_id1 | 5      | const |    1 | Using where |
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 1 row in set (0.00 sec)
差别更大的就是如果使用id1='a',也能够正常执行,只是没有任何匹配的记录。
> select * from test where id1='a';
 Empty set (0.00 sec)
而如果由单引号改为双引号,也能够正常运行。
> select * from test where id1="a";
 Empty set (0.00 sec)
而且双引号的情况下,生成执行计划也没有问题。
> explain select * from test where id1="a";
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 | id | select_type | table | type | possible_keys | key    | key_len | ref  | rows | Extra      |
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 |  1 | SIMPLE      | test  | ref  | idx_id1      | idx_id1 | 5      | const |    1 | Using where |
 +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
 1 row in set (0.00 sec)
可以看出在MySQL中这个时候的范围似乎更宽,在MySQL中不光用单引号,双引号,而且还经常会看到·这种符号。
 这种在MySQL中可以灵活声明一些变化个,举个不太恰当的例子,比如我们创建一个表,一个字段为int,类型为int直接按照下面的方式来写,肯定抛错。
> create table test1(int int);
 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'int int)' at line 1
 crea' at line 1
可以加上·,就可以识别了。
> create table test1(`int` int);
 Query OK, 0 rows affected (0.00 sec)

这个对比的跨度有点大,但是通过一些小把戏似乎还是能够看出在这些类型的转换中,优化器这边的触发情况。再接再厉,继续探究。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0addcd226efa1531a5f1852b99ecafd2.html