关于Mysql中文字段的排序

发表这个帖子是因为产品的一个需求,按照名称首字母正序排序。

目前所有的库默认的字符集都是utf8mb4, 排序规则是utf8mb4_general_ci,这种排序规则不支持按中文的拼音首字母排序
而GBK字符集基本是按照汉字的拼音码进行编码的,所以这里想到了用转换字符集的方式来处理这个问题。

目前想了两个解决方案,如下所示
1. 修改表字段的字符集,修改为 gbk
2. 调整查询使其支持CONVERT语句,并使用CONVERT将目标字段转换为gbk编码后再排序

第一种方案需要调整数据库的表字段,可能会引起之前数据的异常,故采用第二种方式

下面介绍如何引入并在EFCore中使用

1. 添加Module到基础服务中,打开基础服务所在根路径,比如基础服务名称为BasicManage ,则打开benchint.ghis.basicmanage文件夹,并使用命令行执行以下命令

 

dotnet sln add (ls -r ../benchint.ghis/Modules/EntityFrameworkCore.Extensions/src/*.csproj) -s Modules/EntityFrameworkCore.Extensions/src/

 

2. 注册
    在基础服务的EntityFrameworkCore层中,修改DbContext中的代码如下:

public class xxxDbContext {
                 
                ...
                 
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
                        // 注册MySqlFunction
            optionsBuilder.UseMySqlFunctions();
 
            base.OnConfiguring(optionsBuilder);
                        ...
        }
                 
                ...
                 
}

3. 在基础服务的仓储服务 EfCoreRepository 中使用

EF.Functions.Convert(数据库实体字段, "gbk", "gbk_chinese_ci")

例如:

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 @ 2023-03-23 17:05  刘小吉  阅读(448)  评论(0编辑  收藏  举报