文章目录
一、前言
业务在服务化重构的过程中,从原大单体抽离到多个业务组微服务,原有业务实现方案必然会有一定的变化。而依赖方数据展示处理则是其中一方面:
例如,在大单体里,A业务通常直接调用业务组B内部方法借助MySQL自身的排序功能,实现有序列表数据展示,但服务化后,我们需要通过GRPC或者HTTP协议调用其他组提供的接口获取数据,再进行相关业务逻辑处理。
虽然,我们也可以要求原依赖的业务方提供一个接口直接返回排序好的数据,我们仍直接进行相关展示,但一个好的设计,理应要避免外部数据直接影响到自己业务系统展示排序的逻辑,减少系统之间的耦合性。
因此,鉴于我们当前的技术背景,避免依赖外部MySQL排序好的数据,我们该怎么用Go来实现一个排序算法,可以接近原MySQL的排序逻辑,而且能跟客户清晰地说明清楚系统的排序逻辑呢?下文结合网上几种常见的排序方案,简单开发了一种方案可实现接近于MySQL排序展示的结果,供各位参考~
二、MySQL对中文排序简单说明
MySQL对中文排序结果示例:

通常我们这SQL里的using GBK,指的就是以MySQL默认的GBK排列规则【gbk_chinese_ci】进行排序,官方默认排列规则说明如下:

官方说明URL:https://dev.mysql.com/doc/refman/5.6/en/charset-asian-sets.html
而根据【gbk_chinese_ci】排列规则进行排序,实际是根据MySQL内置的权重表进行字符排序的,即MySQL会根据字符找到一个对应的字符权重,以该权重作为排序的对比标准。
官方相关说明:

因此,如果我们要完全复刻一个MySQL的【gbk_chinese_ci】排列规则,是需要一定成本的,但目前综合评估暂无必要,我们可以通过观察、实践与相关文档的查阅,得出MySQL对中文排序的表面规律,因此,一般只要能在保证代码质量的前提下,以适合的成本稳定地满足业务需求即可。
三、网上常见几种Go对中文排序方案
第一种,直接用原生的sortstring对中文排序
实例代码:
package main
import (
"fmt"
"sort"
)
func main() {
testStrings := []string{
"啊", "1", "宝", "邬", "袄", "包", "Leilani", "bru", "Baa", "a", "A", "laa", "啊1", "00aa", "2", "O", "6", "9", "8"}
sort.Strings(testStrings)
fmt.Println(testStrings)
}
排序结果:
[00aa 1 2 6 8 9 A Baa Leilani O a bru laa 包 啊 啊1 宝 袄 邬]
可以看出对数字、字母排序良好,但大小写敏感,且几乎不支持中文,故不符合需求
第二种,将文本转换成GBK后再进行sort排序
参考: https://blog.youkuaiyun.com/Edu_enth/article/details/99863739
实例代码:
package main
import (
"bytes"
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io/ioutil"
"sort"
)
func main() {
testStrings := []string{
"啊", "1", "宝", "邬", "喆", "俍", "袄", "呃", "包", "Leilani", "bru", "Baa", "a", "A", "laa", "啊1", "00aa", "2",

文章介绍了MySQL对中文排序的原理,并分析了几种Go语言中常见的中文排序方案的优缺点,如直接使用sortstring、GBK编码排序和拼音首字母排序。作者提出了一种新的排序方案,该方案结合字符类型,对非中文和中文分别处理,以达到接近MySQL排序效果。此方案降低了对外部数据的依赖,满足了业务需求。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



