目标:mysql中实现中文排序
方案1:修改mysql字符集及排序规则,字符集设置成gbk,排序规则设置成gbk_chinese_ci
缺点:字符集gbk不支持除中文、英文以外的其他语言,局限性大。
方案2:在sql中对需要进行中文排序的字段进行转码成gbk,如 order by column_name =>order by convert(column_name using gbk)
缺点:在每个sql的order by的地方都需要加上convert函数
方案3:在每个表中加入一个字段pinyin,该字段保存需要排序的字段的拼音,order by pinyin
缺点:在每次插入数据都需要先转成pinyin,然后持久化
方案4:字符集使用utf-8,拦截执行的sql语句,进行sql解析,把order by ?替换成 order by convert(? using gbk)
缺点:目前没有一款java解析工具可以解析所有的sql,使用中会出现sql解析失败的情况。
其他三个方案比较简单,现在只讨论方案4的实现步骤:
①mybatis拦截到sql
②sql语句解析成object
③对object进行反解析,反解析object的orderByElement 对象时,对反解析出来的拼接的sql进行替换
④把mybatis要执行的sql替换成我们反解析出来的新的sql
具体实现可以参考: https://github.com/JohnHello/MyBatisMore