SQLite 内部是按二进制排序, 可以支持 ANSI; FrieDAC 通过 TFDSQLiteCollation 支持了 Unicode 排序, 并可通过其 OnCompare 事件自定义排序.
下面的例子, 测试了这两种排序的不同.
可把下面代码直接贴在空白窗体上, 以快速完成窗体设计:
代码:
procedure TForm1.FormCreate(Sender: TObject); var i: Integer; LCode: Integer; begin {给 FDSQLiteCollation1 设定参数} FDSQLiteCollation1.DriverLink := FDPhysSQLiteDriverLink1; // FDSQLiteCollation1.CollationKind := scCompareString; //这是默认值(Unicode 不区分大小写, 在 Win 下是调用 WinAPI.CompareString); 使用其他选项需要自定义排序规则 FDSQLiteCollation1.LocaleName := 'zh-CN'; FDSQLiteCollation1.Flags := [sfIgnoreCase]; FDSQLiteCollation1.CollationName := 'MyCollation'; //下面所有的调用全要依赖这个名称 FDSQLiteCollation1.Active := True; FDConnection1.Params.Add('DriverID=SQLite'); // FDConnection1.Params.Add('OpenMode=CreateUTF8'); //这是默认值, 可选 CreateUTF16(Unicode) {建立测试表, 三个字段 str(汉字), code(汉字对应的 Unicode 值), id(添加顺序)} FDConnection1.ExecSQL('CREATE TABLE MyTable(str string(10), code integer, id integer)'); // FDConnection1.ExecSQL('CREATE TABLE MyTable(str string(10) COLLATE MyCollation, code integer, id integer)'); //用在表设计时 {添加测试数据数据} for i := 0 to 99 do begin LCode := Random($9FA5-$4E00); FDConnection1.ExecSQL('INSERT INTO MyTable(str, code, id) VALUES(:1, :2, :3)', [WideChar($4E00 + LCode), LCode, i+1]); end; FDQuery1.Open('SELECT * FROM MyTable'); //无排序 end; procedure TForm1.Button1Click(Sender: TObject); begin FDQuery1.Open('SELECT * FROM MyTable ORDER BY str'); //SQLite 内置排序 end; procedure TForm1.Button2Click(Sender: TObject); begin FDQuery1.Open('SELECT * FROM MyTable ORDER BY str COLLATE MyCollation'); //FireDAC 默认排序 end;
测试效果图:

分类:
数据库编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2008-05-23 WinAPI: BeginPath、EndPath、StrokePath、FillPath、StrokeAndFillPath
2008-05-23 WinAPI: EqualRect、EqualSid、EqualPrefixSid - 判断一个矩形(或其他结构)是否相等
2008-05-23 WinAPI: SetRectEmpty、IsRectEmpty
2008-05-23 WinAPI: SetRect 及初始化矩形的几种办法
2008-05-23 WinAPI: PtInRect - 判断点是否在矩形中