为了账号安全,请及时绑定邮箱和手机立即绑定

如何在SQLite查询中忽略重音(Android)

如何在SQLite查询中忽略重音(Android)

收到一只叮咚 2019-09-03 17:12:44
我是Android的新手,我正在使用SQLite进行查询。我的问题是,当我在字符串中使用重音时,例如AAAAAAAAAAAAAAAAAA如果我做:SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%a%' ORDER BY MOVIE_NAME;回归:AAAaaa(它忽略了其他人)但如果我这样做:SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%à%' ORDER BY MOVIE_NAME;回归:ààà(忽略标题“ÀÀÀ”)我想在SQLite数据库中选择字符串而不关心重音和大小写。请帮忙。
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

通常,SQL中的字符串比较由列或表达式COLLATE规则控制。在Android中,只预定义了三个校对序列:BINARY(默认),LOCALIZED和UNICODE。它们都不适合您的用例,遗憾的是,Java API中没有公开用于安装新归类函数的C API。


要解决这个问题:


例如,向表中添加另一列 MOVIE_NAME_ASCII

将值存储到此列中并删除重音符号。您可以通过将字符串规范化为Unicode Normal Form D(NFD)并删除非ASCII代码点来删除重音,因为NFD表示重音字符大致为纯ASCII +组合重音符号:


String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD)

    .replaceAll("[^\\p{ASCII}]", "");

您的文本是否在此ASCII规范化列上搜索,但显示原始unicode列中的数据。


查看完整回答
反对 回复 2019-09-03
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您需要查看这些,而不是重音字符,而是完全不同的字符。您也可以寻找a,b或c。话虽这么说,我会尝试使用正则表达式。它看起来像:


SELECT * from TB_MOVIE WHERE MOVIE_NAME REGEXP '.*[aAàÀ].*' ORDER BY MOVIE_NAME;


查看完整回答
反对 回复 2019-09-03
  • 3 回答
  • 0 关注
  • 441 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信