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