NHibernate、SQLite 和 Cyrillic 字符:区分大小写和回退查询

Posted

技术标签:

【中文标题】NHibernate、SQLite 和 Cyrillic 字符:区分大小写和回退查询【英文标题】:NHibernate, SQLite, and Cyrillic characters: case sensitivity and fallback queries 【发布时间】:2010-08-12 06:09:50 【问题描述】:

我正在使用 NHibernate 查询 SQLite 数据库。一般来说,我想做不区分大小写的字符串查询。最近,我发现虽然我可以插入带有西里尔字符的行,但我无法使用不区分大小写的查询来选择它。这是查询的样子:

string foo = "foo";
IList<T> list = session.CreateCriteria(typeof(T)).
    Add(Expression.Eq("Foo", foo).IgnoreCase()).List<T>();

但是,如果 IgnoreCase() 被删除,我可以使用上述查询选择行。一个天真的解决方法是在第一次查询后检查 list.Count == 0,然后进行后续区分大小写的查询。这种方法的主要缺点是查询不存在的行是一个相当常见的操作,现在由两个查询组成。

问题是,我如何构造一个 single 查询,该查询将从不区分大小写的 Foo 列中进行选择,但也会选择包含西里尔字符的行?

【问题讨论】:

【参考方案1】:

默认情况下,不区分大小写的查询仅适用于 SQLite 中的 ASCII 字符。

查看此常见问题解答:Case-insensitive matching of Unicode characters does not work.

【讨论】:

谢谢。这描述了为什么它不起作用。它没有描述潜在的修复或解决方法。从我能找到的情况来看,即使是在 ICU 支持下进行构建似乎也没有一般的案例修复。 对于 LIKE 运算符,SQLite 的 ICU 扩展利用了与语言无关的大小写折叠,AFAIK。也许这里给出的一些例子可能会有所帮助:sqlite.org/cvstrac/fileview?f=sqlite/ext/icu/README.txt

以上是关于NHibernate、SQLite 和 Cyrillic 字符:区分大小写和回退查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQLite“没有这样的表”测试 NHibernate - 生成模式

Fluent NHibernate and Mysql,SQLite

NHibernate 与 C#-Sqlite 在 > .NET 2.0 中没有 DbConnection

在我的 NHibernate / SQLite 项目中提交非常慢

在SQLite上使用NHibernate时获取“Dababase被锁定”(没有事务的多进程)

通过(Fluent)NHibernate添加到SQLite DB时,DateTime不正确