当前使用版本(必填,否则不予处理)

版本:com.baomidou:mybatis-plus-boot-starter:3.3.1

数据库:Mysql 5.7版

该问题是如何引起的?(确定最新版也有问题再提!!!)

我们存的数据如果有大小写重名的,比如字段 type varchar(16) 有'user'和'USER'两个值,查询时 _where type='user'_会同时查出两条记录。 根本原因:Mysql默认的字符集是utf-8,其默认的字符校验集不区分大小写。

重现步骤(如果有就写完整)

  1. 建表(使用默认字符集)并建测试数据
create table `charset_test`(
  `id` int, 
  `type` varchar(16)
)ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 ;
insert into `charset_test`(id, type) values(1, 'user'),(2,'USER');
  1. 查询
select type from charset_test where type = 'user';

Mybatis plus伪代码:

this.baseMapper.selectList(Wrappers.<DataSource>lambdaQuery()
                .eq(DataSource::getType, 'user');

报错信息

查询结果会出现两条记录, 'user'和'USER'都被查出来了。

解决方案:

在大小写敏感的字段前使用 BINARY关键字

select type from charset_test where BINARY type = 'user';

Comment From: miemieYaho

不会在api上支持方言,用.eq("BINARY type","user")

Comment From: RollsBean

这个eq 的入参是传入的泛型,也就是表的Java bean,不能定义成string的 MyBatis-Plus Mysql 查询是否可以支持BINARY关键字以区分字段值的大小写

刚才我又试了下自定义SQL,我在mapper中定义