SQLite 默認排序為 UNICODE 編碼序,與漢語拼音沒有任何聯系,而人們常習慣拼音序。
解決方法在 C# 中其實很簡單,但網上尚未見有任何中文資料說這事,只有 C 方法。以下我是通過一英文網頁學到的。
首先,定義和注入規則
示例代碼如下,很簡單無須多解釋。只有一點必須注意,對同一個函數只能注入一次,不得重復,所以注入語句寫在主函數中再合適不過。
- static class Program {
- // 主函數
- [STAThread]
- static void Main()
- {
- SQLiteFunction.RegisterFunction(typeof(SQLiteCollation_PinYin)); // 注入
- Config.Reload();
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new MainForm());
- Config.Save();
- }
- // 中文拼音排序規則
- [SQLiteFunction(FuncType = FunctionType.Collation, Name = "PinYin")]
- class SQLiteCollation_PinYin: SQLiteFunction {
- public override int Compare(string x, string y)
- {
- return string.Compare(x, y);
- }
- }
- }
而后,使用
使用時, SQL 代碼不能簡單地寫上 ORDER BY XXX 了事,還得用上 COLLATE ,示例如下:
- SELECT * FROM Client_V
- ORDER BY
- City COLLATE PinYin,
- Unit COLLATE PinYin,
- Name COLLATE PinYin;
COLLATE 便是指定規則, PinYin 便是上面 C# 代碼中定義規則時的 Name = "PinYin" 。
另外,用建表、建立索引時,也應當考慮使用 COLLATE ,這樣才能讓數據庫快起來。
轉載於:http://blog.csdn.net/ch_fb/article/details/6682791