加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite字符串比较上的本地化COLLATE

发布时间:2020-12-12 18:57:14 所属栏目:百科 来源:网络整理
导读:我想比较SQLite数据库中的两个字符串而不关心重音和大小写.我的意思是“événement”应该等于“evenèment”. 在Debian Wheezy上,SQLite包不提供ICU.所以我编译了包含ICU模块的官方SQLite包(版本3.7.15.2 2013-01-09 11:53:05).现在,我确实有一个更好的Unic
我想比较SQLite数据库中的两个字符串而不关心重音和大小写.我的意思是“événement”应该等于“evenèment”.

在Debian Wheezy上,SQLite包不提供ICU.所以我编译了包含ICU模块的官方SQLite包(版本3.7.15.2 2013-01-09 11:53:05).现在,我确实有一个更好的Unicode支持(originallower()仅适用于ASCII字符,现在它适用于其他字母).但我无法将比对应用于整理.

SELECT icu_load_collation('fr_FR','FRENCH');
SELECT 'événement' COLLATE FRENCH = 'evenement';
-- 0 (should be 1)
SELECT 'événement' COLLATE FRENCH = 'événement';
-- 0 (should be 1 if collation was case-insensitive)
SELECT lower('événement') = 'événement';
-- 1 (at least lower() works as expected with Unicode strings)

SQLite documentation确认这是应用整理的正确方法.我认为documentation of this ICU extension有点轻(几个例子,没有关于整理的区分大小写).

我不明白为什么COLLATE运算符在上面的例子中没有效果.请帮忙.

解决方法

我花了几个小时来了解情况……在SQLite中定义ICU校对的方式(几乎)没有比较的发生率.根据ICU的说法,例外情况是带有灌注标记的希伯来文本.这是ICU库的排序规则的默认行为.使用SQLite,当加载ICU时,LIKE变得不区分大小写,但是不能通过这种方式实现加重字母的标准化.

我终于明白我需要的是设置
strength
整理的
primary level
而不是默认的高等级.

我发现无法通过语言环境进行设置
(例如,SELECT icu_load_collat??ion(‘fr_FR,strength = 0′,’french’)的几个变体是无用的).
所以唯一的解决方案就是修补SQLite的代码.
由于ucol_setStrength()函数很容易
在ICU API.

最小的变化是一行补丁:添加行ucol_setStrength(pUCollat??or,0);在pUCollat??or = ucol_open之后(zLocale,& status);在函数icuLoadCollat??ion()中.
对于向后兼容的更改,我在icu_load_collat??ion()中添加了一个可选的第三个参数来设置强度:
0表示默认,1表示主要,等等,最多4个四元.
见diff.

最后我有我想要的东西:

SELECT icu_load_collation('fr_FR','french_ci',1); -- collation with strength=primary
SELECT 'événement' COLLATE french_ci = 'evenèment';
-- 1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读