我想比较SQLite数据库中的两个字符串,而不关心重音符号和大小写。我的意思是“Événement”应等于“evenèment”。
在Debian Wheezy上,SQLite软件包不提供ICU。所以我编译了包含ICU模块的官方SQLite软件包(版本3.7.15.2 2013-01-09 11:53:05)。现在,我确实有更好的Unicode支持(原始的lower()
仅适用于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归类的方式(几乎)在比较中没有发生。根据重症监护病房,根据异常(exception)情况,希伯来语文本带有斜线标记。这是ICU库整理的默认行为。使用SQLite时,加载ICU时LIKE
变得不区分大小写,但是无法通过这种方式实现重音字母的规范化。
我终于明白,我需要设置
strength
归类到
primary level
而不是默认的第三级。
我找不到通过语言环境设置此方法的方法
(例如SELECT icu_load_collation('fr_FR,strength=0', 'french')
的几种变体是没有用的)。
因此,唯一的解决方案是修补SQLite的代码。
有了ucol_setStrength()
函数,这很容易
在ICU API中。
最小的变化是一个单行修补程序:在ucol_setStrength(pUCollator, 0);
函数中的pUCollator = ucol_open(zLocale, &status);
之后添加icuLoadCollation()
行。
对于向后兼容的更改,我在icu_load_collation()
中添加了一个可选的第三个参数来设置强度:
默认值是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
关于unicode - SQLite字符串比较上的本地化COLLATE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15051018/