前言:

一般数据库查询字符串的时候都是忽略大小写的,但是sqlite查询时是区分大小写的。不过sqlite在定义表/查询的时候支持忽略大小写。

定义数据库表/查询匹配时加COLLATE NOCASE

如:

create table if not exists tb_test_case (id text PRIMARY KEY, data text COLLATE NOCASE);

select * from tb_test_case where data = 'a'  COLLATE NOCASE;


进入正题:

项目中使用sqlite,某些数据查询需要支持忽略大小写,使用上面的方法,问题解决了!且慢,咋们借一步说话。看起来是解决了问题,而且在大部分场景下面都不会有问题,但是其实选择sqlite的大小写,就已经埋雷了,就等着突然一天用户反馈很奇怪的问题。

sqlite支持查询ASCLL字符忽略大小写,但是不支持查询宽字符(罗马字符Ⅲ等)忽略大小写。

下面我们来实例验证一下:

1:创建表tb_test_case,data字段定义为忽略大小写

create table if not exists tb_test_case (id text PRIMARY KEY, data text COLLATE NOCASE);

2:插入两条数据(ps:罗马字符Ⅲ的小写为ⅲ)
insert into tb_test_case values('id1', 'iⅢi');
insert into tb_test_case values('id2', 'iⅲi');

wKiom1Tatz_So_t0AACPzGkieRo524.jpg

spacer.gif

3:

select * from tb_test_case where data = 'iⅢi';wKiom1Tat2HC-wAjAACKc7hiSxg526.jpg

spacer.gifselect * from tb_test_case where data = 'iⅲi';

wKioL1TauNrhI8mBAACONslsvF8410.jpg



ps:通过上面两条查询语句的结果,包含Ⅲ时,没查询到小写的ⅲ;反之亦然;

4:

insert into tb_test_case values('id3', 'aaa');

insert into tb_test_case values('id4', 'AAA');

wKiom1Tat4eCoqR_AADCCKa88Hs697.jpg

spacer.gif

5:

select * from tb_test_case where data = 'AAA';

wKioL1TauHuC7QrlAACT8-AHBvE241.jpg

spacer.gifselect * from tb_test_case where data = 'aaa';

wKiom1Tat4fwaMS7AAB6gNBMnqM086.jpg

spacer.gif

ps:通过上面的查询语句,看出ASCLL字符是支持忽略大小写的。


后记:

使用sqlite忽略大小写,如果能保证需支持忽略大小的字段不包含宽字符,使用sqlite查询忽略大小写是没问题的。否则,你已经掉坑里面了,考虑其他方案吧!

ps:我们项目使用sqlite记录的元数据信息。出现问题以后,反馈的问题现象很奇怪。由于第一手处理用户问题是服务部的同事。研发人员分析问题时,现场已被破坏。分析了一整天才找到问题原因。然后设计、评审问题的解决方案+编码测试搞了两周。设计、评审兼容性升级方案+编码测试又搞了两周。惨痛的填坑经历。。。


因个人水平有限,如有笔误、讲解不清楚、探究的不清楚的地方。还请各位路过的小伙伴们海涵,并指出问题,帮助我干掉它。转载请注明出处。