当前使用版本(必填,否则不予处理)
版本:com.baomidou:mybatis-plus-boot-starter:3.3.1
数据库:Mysql 5.7版
该问题是如何引起的?(确定最新版也有问题再提!!!)
我们存的数据如果有大小写重名的,比如字段 type varchar(16) 有'user'和'USER'两个值,查询时 _where type='user'_会同时查出两条记录。 根本原因:Mysql默认的字符集是utf-8,其默认的字符校验集不区分大小写。
重现步骤(如果有就写完整)
- 建表(使用默认字符集)并建测试数据
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');
- 查询
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的
刚才我又试了下自定义SQL,我在mapper中定义
异常:
... 46 more
Caused by: net.sf.jsqlparser.JSQLParserException
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:137)
at com.baomidou.mybatisplus.core.parser.AbstractJsqlParser.parser(AbstractJsqlParser.java:60)
... 57 more
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "BINARY" "BINARY"
at line 5, column 13.
Was expecting one of:
"!"
"("
"NOT"
Comment From: miemieYaho
github 搜 jsqlparser