。net中SQLite中不区分大小写的顺序

问题描述 投票:5回答:5

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

默认情况下,SQLite select order by子句排序区分大小写,我希望结果不区分大小写,我发现“ COLLATE NOCASE”,但是文档说它将只处理ascii范围内的英文字符,我希望真正的语言国际化使用CultureInfo.CurrentCulture排序规则进行不敏感的排序(使它使用String.Compare可以解决问题)。

.net sqlite sql-order-by case-insensitive
5个回答
3
投票

我相信在当前版本的SQLite中未提供这种归类。因此,似乎最明智的计划是从查询中删除排序,然后再在纯.Net中排序,在其中您可以完全控制并访问诸如线程的区域性信息之类的结构。

由于两者都在同一过程中发生,因此除非您的数据集非常大,否则在性能方面不会有太大区别。

SQLite 3确实允许用户定义归类功能,并且可以在SQLite.Net中作为.net函数来完成这些功能,但是跨托管/非托管边界来回调用的开销相当大。这是一个persons attempts to do it in 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)
        );
    }
}

发布脚本,如果您喜欢:有一个不错的SQLite构建,其中integrates the ICU library支持“适当”的unicode支持订购/ like / upper / lower,但您需要将其集成到用作.Net包装器支持的sqlite代码中。这很多都不容易。


1
投票

SQLite.NET允许您在C#中定义可在SQL查询中使用的自定义函数。因此,应该可以在C#中编写一个custom_upper或custom_lower函数,以使用当前的区域性排序规则来处理大小写转换。


0
投票

是的,这比您想的要复杂得多。在某些文化中,规则是不同的,并且不知道您想以此为基础的文化是不可能的。考虑Turkish的著名例子(amoung i18n人)。


0
投票

您可以简单地使用lower() sqlite功能:


-1
投票

您可以使用ToLower()方法获得快速结果:

© www.soinside.com 2019 - 2024. All rights reserved.