Tidb查询sql在where语句中添加括号,会导致查询的列名字错误

【 TiDB 使用环境】生产环境
【 TiDB 版本】Release Version: v7.2.0
【遇到的问题:问题现象及影响】
查询如下

 SELECT teacher_id,id_number  FROM  tb_teacher_user WHERE  (teacher_id IN (125)); 
 SELECT teacher_id,id_number  FROM  tb_teacher_user WHERE  teacher_id IN (125);

结果
image

当我交换teacher_id,id_number 顺序也会正确,第一次修改sql也是正确的,之后就是列名字错误,数据是对的。

表结构如下

teacher_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘教师id’,
teacher_name varchar(100) NOT NULL COMMENT ‘教师姓名’,
id_number varchar(30) DEFAULT ‘’ COMMENT ‘身份证号’,
phone varchar(50) DEFAULT NULL COMMENT ‘电话号’,
password varchar(100) DEFAULT NULL COMMENT ‘登录密码’,
province_name varchar(50) DEFAULT NULL COMMENT ‘省份名称’,
province_code varchar(20) DEFAULT NULL COMMENT ‘省份code’,
city_name varchar(50) DEFAULT NULL COMMENT ‘城市名称’,
city_code varchar(20) DEFAULT NULL COMMENT ‘城市code’,
county_name varchar(50) DEFAULT NULL COMMENT ‘区县名称’,
county_code varchar(20) DEFAULT NULL COMMENT ‘区县code’,
school_id bigint(11) DEFAULT NULL COMMENT ‘学校id’,
school_name varchar(50) DEFAULT NULL COMMENT ‘学校名称’,
last_login_time datetime DEFAULT NULL COMMENT ‘最近登录时间’,
login_num int(50) DEFAULT ‘0’ COMMENT ‘账号登录次数’,
role_name varchar(100) DEFAULT NULL COMMENT ‘角色名称’,
credentials_non_expired tinyint(1) DEFAULT ‘0’ COMMENT ‘密码是否过期’,
enabled tinyint(1) DEFAULT ‘1’ COMMENT ‘可用状态【1=正常,0禁用】’,
account_non_locked tinyint(1) DEFAULT ‘1’ COMMENT ‘账号是否锁定【0=锁定,1=正常】’,
account_non_expired tinyint(1) DEFAULT ‘1’ COMMENT ‘是否过期【0=过期,1=未过期】’,
user_source_type int(1) DEFAULT NULL COMMENT ‘用户来源’,
create_time datetime DEFAULT NULL COMMENT ‘创建时间’,
account_v tinyint(1) DEFAULT ‘1’ COMMENT ‘账号类型【0虚拟、1真实】’,

补充一点,当出现这个bug时候强制指定别名也无效

添加完整的复现,以及使用命令行

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_test
-- ----------------------------
DROP TABLE IF EXISTS `tb_test`;
CREATE TABLE `tb_test` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `id_number` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of tb_test
-- ----------------------------
BEGIN;
INSERT INTO `tb_test` (`id`, `name`, `id_number`) VALUES (1, 'test1', '12716761726');
INSERT INTO `tb_test` (`id`, `name`, `id_number`) VALUES (2, 'test2', '125616261172');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

【看到的非预期行为】
列名返回错误,以及别名指定也是错误的

【期望看到的行为】
正确的select的列名字

https://github.com/pingcap/tidb/issues/50346

7.2版本是个测试版本,不建议使用,升级到7.5吧

测试版本也不至于这种低级错误

没想明白是怎么会出现这种bug,内容是对的吗

主要是不知道为啥会出现这个问题,调换下顺序就对了

是的,是对的

:thinking:按说不应该啊,会不会和sql工具有关?换个工具试试呢?

1 个赞

我使用命令行也是这个问题,主要是业务中报错,我才会排查到这个问题,MySQL中没有任何问题

TiDB 不是 mysql 可能有些差异性,你尝试在别的工具上看看有没有问题。

BUG确实很离谱。

生产环境一定选LTS版本,官网明确说了DMR仅供开发测试使用。


TiDB 版本周期支持策略 | PingCAP

表妹还是让研发看看这个bug吧

是的,虽然这个是测试版本,但是出现的问题太奇怪了

我尽快推动升级,但是业务最近一直在跑

可能自动测试确实不容易发现。
你不是调整字段顺序就正确了吗,开发改下很快。

我一直讨厌开发加些没用的括号,sql格式美化后很难看 :rofl:

没问题

不是 这个是框架加的,mybatis,所以我们也很奇怪

多谢您,我添加了,最小的测试,使用命令行

:thinking:等表妹的结论吧~第一次遇到这种情况。

1 个赞

你这个bug 会改列名?

建议用lts版本试试