关于Mysql中文字段的排序
发表这个帖子是因为产品的一个需求,按照名称首字母正序排序。
目前所有的库默认的字符集都是utf8mb4, 排序规则是utf8mb4_general_ci,这种排序规则不支持按中文的拼音首字母排序
而GBK字符集基本是按照汉字的拼音码进行编码的,所以这里想到了用转换字符集的方式来处理这个问题。
目前想了两个解决方案,如下所示
1. 修改表字段的字符集,修改为 gbk
2. 调整查询使其支持CONVERT语句,并使用CONVERT将目标字段转换为gbk编码后再排序
第一种方案需要调整数据库的表字段,可能会引起之前数据的异常,故采用第二种方式
下面介绍如何引入并在EFCore中使用
1. 添加Module到基础服务中,打开基础服务所在根路径,比如基础服务名称为BasicManage ,则打开benchint.ghis.basicmanage文件夹,并使用命令行执行以下命令
1 | dotnet sln add (ls -r ../benchint.ghis/Modules/EntityFrameworkCore.Extensions/src/*.csproj) -s Modules/EntityFrameworkCore.Extensions/src/ |
2. 注册
在基础服务的EntityFrameworkCore层中,修改DbContext中的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class xxxDbContext { ... protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 注册MySqlFunction optionsBuilder.UseMySqlFunctions(); base .OnConfiguring(optionsBuilder); ... } ... } |
3. 在基础服务的仓储服务 EfCoreRepository 中使用
1 | EF.Functions.Convert(数据库实体字段, "gbk" , "gbk_chinese_ci" ) |
例如:
1 2 3 4 5 6 7 8 | var results = await dbContext.Set<SettlementExpenseItem>() .Select(x => new { PriceListId = x.PriceListId, OrderByPriceListName = EF.Functions.Convert(x.PriceListName, "gbk" , "gbk_chinese_ci" ), // 先转换字符集以及排序规则 }) .OrderBy(x => x.OrderByPriceListName) // 再排序 .ToListAsync(cancellationToken); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?