`
coding1688
  • 浏览: 232290 次
  • 来自: 上海
社区版块
存档分类
最新评论

今天我发现了MySQL的一个Bug

阅读更多

今天有个测试人员报告说导入通讯录的程序有点问题,无法导入或者只能部分导入,但不会报错。

导入通讯录时会检查联系人姓名是否会在待导入的群组中,如果不在才导入,否则忽略。

我从日志中找出了一个SQL语句,如下:

SELECT contact_id, contact_name, contact_title, gender, birthday, specday, idno, profession,
 company, dept, region,
address, postcode, mobile, phone, fax, email, qq, home_phone, home_address, other, remarks, 
tenant_id, created_by, create_time, modified_by, modify_time FROM mab_contact_info 
WHERE contact_name = '陈志林' 
AND contact_id IN (SELECT contact_id FROM mab_contact_group WHERE contact_group_id = 36);
我一看,就觉得子查询有点问题,因为mab_contact_group表中根本就没有contact_id字段啊。
mysql> desc mab_contact_group;
+--------------------+--------------+------+-----+---------+----------------+
| Field              | Type         | Null | Key | Default | Extra          |
+--------------------+--------------+------+-----+---------+----------------+
| contact_group_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| contact_group_name | varchar(32)  | NO   |     | NULL    |                |
| super_group_id     | int(11)      | YES  | MUL | NULL    |                |
| tenant_id          | int(11)      | NO   | MUL | NULL    |                |
| contact_group_path | varchar(256) | YES  |     | NULL    |                |
| created_by         | int(11)      | YES  | MUL | NULL    |                |
| create_time        | datetime     | NO   |     | NULL    |                |
| modified_by        | int(11)      | YES  | MUL | NULL    |                |
| modify_time        | datetime     | YES  |     | NULL    |                |
+--------------------+--------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
但是程序没有报错。于是我把它贴到MySQL中执行,确实不报错,而且找到了数据:
mysql> SELECT contact_id, contact_name, contact_title, gender, birthday, specday, 
idno, profession, company, dept, region,
    -> address, postcode, mobile, phone, fax, email, qq, home_phone, 
home_address, other, remarks, tenant_id, created_by, create_time, modified_by, modify_time 
FROM mab_contact_info 
    -> WHERE contact_name = '陈志林' 
AND contact_id IN (SELECT contact_id FROM mab_contact_group WHERE contact_group_id = 36);
+------------+--------------+---------------+--------+----------+---------+------+------------+---------+------+--------+---------+----------+-------------+-------+------+-------+------+------------+--------------+-------+-----------------------------------------------------------------+-----------+------------+---------------------+-------------+-------------+
| contact_id | contact_name | contact_title | gender | birthday | specday | idno | profession | company | dept | region | address | postcode | mobile      | phone | fax  | email | qq   | home_phone | home_address | other | remarks                                                         | tenant_id | created_by | create_time         | modified_by | modify_time |
+------------+--------------+---------------+--------+----------+---------+------+------------+---------+------+--------+---------+----------+-------------+-------+------+-------+------+------------+--------------+-------+-----------------------------------------------------------------+-----------+------------+---------------------+-------------+-------------+
|        138 | 陈志林       | NULL          | NULL   | NULL     | NULL    | NULL | NULL       | NULL    | NULL | NULL   | NULL    | NULL     | 13975188486 | NULL  | NULL | NULL  | NULL | NULL       | NULL         | NULL  | 导入自《20121128115430956106_contact班主任及管理人员.xls》第2行 |      3000 |       9024 | 2012-11-28 11:54:32 |        NULL | NULL        |
+------------+--------------+---------------+--------+----------+---------+------+------------+---------+------+--------+---------+----------+-------------+-------+------+-------+------+------------+--------------+-------+-----------------------------------------------------------------+-----------+------------+---------------------+-------------+-------------+
1 row in set (0.00 sec)

但是把其中的子查询单独执行,会有问题。

mysql> SELECT contact_id FROM mab_contact_group WHERE contact_group_id = 36;
ERROR 1054 (42S22): Unknown column 'contact_id' in 'field list'
mysql> 
我的第一反应是,我发现MySQL的一个Bug啦。
。。。。。。

 

如果你觉得这个事情很有意思或很没意思,请移步到下面的地址看个究竟:

http://www.vktone.com/articles/find-bug-of-mysql-oh.html

 

 

3
5
分享到:
评论
5 楼 shenliuyang 2012-11-28  
     你要是查到数据了,就会报错哦。 
4 楼 mysavvy 2012-11-28  
这是你sql的bug
3 楼 inta 2012-11-28  
你执行之后sql语句会默认的按照这种方式执行:
SELECT A.contact_id, A.contact_name, A.contact_title, ...
FROM mab_contact_info A
    -> WHERE A.contact_name = '陈志林'
AND A.contact_id IN (SELECT A.contact_id FROM mab_contact_group WHERE contact_group_id = 36);

这时候用的是前一个表的字段,如果前一个表有值自然能够查到数据,而且不报错,因为根本就没有错误
2 楼 rensanning 2012-11-28  
这不是Bug,你去试试其他所有数据库就知道了!
在Where部分是可以取到from表的任何字段的,这里的subquery只是一个特例而已。
1 楼 sgq0085 2012-11-28  
把涉及到的表结构贴一下

相关推荐

Global site tag (gtag.js) - Google Analytics