关于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);

  

 

posted @   刘小吉  阅读(567)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示