面试题:Mysql数据库对varchar类型字段用int进行查询问题

表数据是这样:

CREATE TABLE `t_test`  (
  `id` int(11) NOT NULL,
  `no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_test
-- ----------------------------
INSERT INTO `t_test` VALUES (1, '1', '张三');
INSERT INTO `t_test` VALUES (2, '1a', '李四');
INSERT INTO `t_test` VALUES (3, '1aa', '王五');
INSERT INTO `t_test` VALUES (4, 'bb', 'aaa');
INSERT INTO `t_test` VALUES (5, 'aa1', 'bb');
INSERT INTO `t_test` VALUES (6, '22b', 'cc');
INSERT INTO `t_test` VALUES (7, '200', 'dd');

面试题:Mysql数据库对varchar类型字段用int进行查询问题_第1张图片

今天去面试,面试官问了这么一道题:在上表数据中,下面两条SQL的查询结果是怎么样的?

SELECT * FROM t_test t1 where t1.no  = 1;
SELECT * FROM t_test t1 where t1.no  = '1';

我不加思索的就回答,结果是一样的,只会查到“张三”那条数据。

面试完回来,我就在想,面试官不至于问那么脑残的问题啊?我就试了一下,结果大吃一惊。。(可能是我以前写sql比较规范吧,我真的没碰到过这种问题)

这条SQL:SELECT * FROM t_test t1 where t1.no = 1; 查出来的结果如下:

面试题:Mysql数据库对varchar类型字段用int进行查询问题_第2张图片

事实证明,还是我太年轻了。

网上查了资料,原来是在 MySQL 中,字符串和数字做比较的话,是将字符串转换成数字。就比如上面那条sql会把varchar类型的no字段转换成int类。

所以:SELECT * FROM t_test t1 where t1.no = 1

等价于:SELECT * FROM t_test t1 where CAST(t1.no AS signed int) = 1;

另外补充一句:对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能

转换结果可以用以下sql查看到:

SELECT cast(t1.no as SIGNED INTEGER),name FROM  t_test t1;

面试题:Mysql数据库对varchar类型字段用int进行查询问题_第3张图片

 

你可能感兴趣的:(数据库)