sqlite查询忽略大小写,你踩坑了吗?

前言:

一般数据库查询字符串的时候都是忽略大小写的,但是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 textCOLLATE 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.gif

select * 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.gif

select * from tb_test_case where data = 'aaa';

wKiom1Tat4fwaMS7AAB6gNBMnqM086.jpg

spacer.gif

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

后记:

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

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


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

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能