在.net中的SQLite中的case insesetive order

Nir*_*Nir 5 .net sqlite sql-order-by case-insensitive

我正在使用SQLite.net(http://sqlite.phxsoftware.com)从C#程序中使用SQLite .

默认情况下,SQLite select order by子句排序区分大小写,我希望结果排序不区分大小写,我发现"COLLATE NOCASE"但文档说它只会处理ascii范围内的英文字符,我想要真正的语言国际不区分大小写排序使用CultureInfo.CurrentCulture排序规则(使它使用String.Compere会做到这一点).

谢谢

Shu*_*oUk 3

我相信当前版本的 SQLite 中没有提供这种排序规则。因此,最明智的计划似乎是从查询中删除排序,然后在纯 .Net 中进行排序,您可以完全控制和访问线程的区域性信息等构造。

由于两者都发生在同一进程中,因此除非您的数据集非常大,否则不会对性能产生太大影响。

SQLite 3 确实允许用户定义的排序函数,并且这些函数可以在 SQLite.Net 中作为 .net 函数完成,但跨托管/非托管边界来回调用的开销相当大。这是一个人尝试用 c++ 来做这件事。除非您可以访问其他人在 C++ 中经过充分测试且稳定的 unicode 文化敏感排序,否则我建议尽可能坚持使用简单的排序方法。

当然,如果用户定义的排序规则的性能足以满足您当前的需求,那么就使用它。

[SQLiteFunction(Name = "CULTURESORT", FuncType = FunctionType.Collation)]
class CultureSort : SQLiteFunction
{
    public override int Compare(string param1, string param2)
    {
        return String.Compare(
            param1,param2, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想变得更奇特,请发表脚本:有一个受祝福的 SQLite 构建,它集成了 ICU 库,以在 ordering/like/upper/lower 上提供“适当”的 unicode 支持,但您需要将其集成到用作支持的 sqlite 代码中.Net 包装器。这很多并不容易。