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

浙公网安备 33010602011771号