「升级」升级MySQL 8.0的诡异故障,utf8mb4_0900_ai_ci是什么?( 三 )
有程序员看到这个需求,想当然就按照先后顺序,用1、2、3、4、5来表示对应状态,确实简单不会出错,也方便先后对比,比如要查找所有“已确认”之前的订单,就查查“已确认”的状态码是4,那么找状态码<4的订单就可以。
然后,有一天,忽然要在两个状态之间加入某个中间状态,比如“已确认”之后需要新的风险评估,通过了才可以去拣货,怎么办?总不可能在3和4之间加一个3.5吧?因为这个数据字段本来就是整数型啊。
所以“有经验”一点的程序员会改改,一开始就不按照1、2、3、4、5这样来分配状态码,而是按100、200、300、400、500,留足空隙,这样就避免了3.5的尴尬,直接给“风控系统已通过”分配350就可以了。
但这仍然不够。如果业务忽然要求既有顺序要变,比如之前“已确认”在前,“风控系统已通过”在后,现在要求“风控系统已通过”在前,“已确认”在后,该怎么办?350总不可能大于400呀。
如果你了解了collation就会发现,这是同样的问题。数据的标识和数据的有序性应当隔离开来,标识是一套规范,有序性是另一套规范,两者可以随意组合。你看,Unicode字符的排序可以按照字符的编码值来,也可以按照其它规范来——加载不同collation就是了嘛。
所以,“已下单,未支付”的代码就可以是OUPD,“已支付“的代码就可以是PDED,“已确认”的代码就可以是CFMD…… 它们只用来做唯一标识,没有任何其它意义。然后在外面定义一套顺序规则,比如OUPD < PDED < CFMD,然后提供一个查询接口,做任何比较的时候都查询这个接口就好——实际上许多语言可以自定义compare函数来做排序,道理就在这里。万一将来要改业务流程,比如加入新状态,或者更改状态的先后顺序,也只需要做一点点更改,规则查询接口保持不变,其它地方更是保持原封不动。
最后我想补充的是,即便你有非常多的软件开发经验,但如果要做“国际化”的业务,仍然会面对许多想不到的问题——e、ē、é、ě、è、ê、?的等价问题就是一例。这类问题,不亲自经历是很难想象的。
【 「升级」升级MySQL 8.0的诡异故障,utf8mb4_0900_ai_ci是什么?】回想起来,十多年前我开始接触这方面业务,还真的积累了一些经验,是坐在办公室里写代码想不到,也非常有意思的问题。如果大家有兴趣,下回我们接着聊。
推荐阅读
- 『吸管』塑料吸管还有吗? 升级版“限塑令”实施首日
- “空壳村”土地撂荒何解?山西石楼加码农地托管促农业提档升级
- 汽车知识|川崎发布2021款Z H2 SE,升级减震和刹车,国内售价或超25w
- 比亚迪唐|动力配置升级 比亚迪唐EV新增车型将于12月上市
- |香港前女首富朱李月华成功升级当奶奶,小婴儿七斤多健康可爱
- 橘猫车探长|销量超3500万辆,这合资车升级换代后,丰田、本田都不是对手!
- 汽车|多项功能进行优化 吉利星瑞推出第二次FOTA升级
- 销量|12.79万起,本田热卖SUV出新款,新配色,配置升级
- 标致|东风标致三车齐发服务升级
- 怎样看待4月26号发布的Ubuntu 18.04
