关于MySQL数据库的数据类型发生隐形转换的问题咨询

网友的问题:

1.MySQL对于int类型索引使用问题,如:tb中有主键id,普通索引tid,在执行SQL:select * from tb where id = 2 order by id 时,
extra为空,这里的id值没带引号,如果带上引号extra也为空。

2.当 select * from tb where tid = 2 order by tid,tid为普通索引,这时tid的值带引号和不带引号就会有区别,带引号时extra会提示额外的排序,不带引号时extra为空,这是怎么一回事?
zhdba

mysqlops的回答:

1.当字段类型为:INT;

SQL优化篇:数据类型隐形转换的危害

导读

曾经写过一篇文章介绍MySQL中创建及优化索引组织结构的思路,但是没有提及关于SQL语句中隐性转换的问题,近期一位网友发现他们系统中业务场景中存在此问题,为此专门分析数据类型隐性转换的威力,告诉大家编写SQL语句时,也许一对单引号就可以引发一场血案。

示例校验的环境

软件环境

MySQL版本:5.1.40、5.1.15

存储引擎:Innodb

操作系统:Linux version 2.6.18-194.el5

数据环境

创建用于测试的表结构:

CREATE TABLE tmp_index_len(ID INT UNSIGNED NOT NULL AUTO_INCREMENT,

                           cate_id MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,

                           brand_name VARCHAR(50) NOT NULL DEFAULT ”,

                           CreateDate TIMESTAMP NOT NULL DEFAULT ’0000-00-00 00:00:00′,

                           PRIMARY KEY(ID),

                           INDEX idx_cid_bname(cate_id,brand_name)

                        )ENGINE=InnoDB CHARACTER SET ‘utf8′ COLLATE ‘utf8_general_ci’;