在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运算符在上面的例子中没有效果.请帮忙.
解决方法
我终于明白我需要的是设置@H_502_26@strength@H_502_26@整理的@H_502_26@primary level@H_502_26@而不是默认的高等级.
我发现无法通过语言环境进行设置@H_502_26@(例如,SELECT icu_load_collation(‘fr_FR,strength = 0′,’french’)的几个变体是无用的).@H_502_26@所以唯一的解决方案就是修补sqlite的代码.@H_502_26@由于ucol_setStrength()函数很容易@H_502_26@在ICU API.
最小的变化是一行补丁:添加行ucol_setStrength(pUCollator,0);在pUCollator = ucol_open之后(zLocale,& status);在函数icuLoadCollation()中.@H_502_26@对于向后兼容的更改,我在icu_load_collation()中添加了一个可选的第三个参数来设置强度:@H_502_26@0表示默认,1表示主要,等等,最多4个四元.@H_502_26@见diff.
最后我有我想要的东西:
SELECT icu_load_collation('fr_FR','french_ci',1); -- collation with strength=primary SELECT 'Événement' COLLATE french_ci = 'evenèment'; -- 1