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会做到这一点).
谢谢
我相信当前版本的 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 包装器。这很多并不容易。
| 归档时间: |
|
| 查看次数: |
3555 次 |
| 最近记录: |