Mysql和Oracle对中文排序

在实际开发中,有时会遇到需要根据人的姓名进行排序的场景,最常见的是按中文转成拼音后的字母顺序排序,本文介绍如何通过数据库实现该排序功能。

MySQL的写法

1
ORDER BY CONVERT(表别名.字段名 USING gbk) COLLATE gbk_chinese_ci ASC

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
select * from (
select '嘉实资产' a, '000830' b
union
select '中金鼎益稳健3号单一资产管理计划' a, '002544' b
union
select 'xx' a, '002281' b
union
select '嘉实资产' a, '300287' b
union
select '中金鼎益稳健3号单一资产管理计划' a, '000977' b
union
select 'xx' a, 'FG909 ' b
union
select '徐州矿务集团有限公司企业年金中金组合' a, '000541 ' b
union
select '徐州矿务集团有限公司企业年金中金组合' a, '005541 ' b
) t
order by CONVERT(t.a USING gbk) COLLATE gbk_chinese_ci ASC,t.b

查询结果

Oracle的写法

1
ORDER BY nlssort(表别名.字段名, 'NLS_SORT=SCHINESE_PINYIN_M')

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
select * from (
select '嘉实资产' a, '000830' b from dual
union
select '中金鼎益稳健3号单一资产管理计划' a, '002544' b from dual
union
select 'xx' a, '002281' b from dual
union
select '嘉实资产' a, '300287' b from dual
union
select '中金鼎益稳健3号单一资产管理计划' a, '000977' b from dual
union
select 'xx' a, 'FG909 ' b from dual
union
select '徐州矿务集团有限公司企业年金中金组合' a, '000541 ' b from dual
union
select '徐州矿务集团有限公司企业年金中金组合' a, '005541 ' b from dual
) t
order by nlssort(t.a, 'NLS_SORT=SCHINESE_PINYIN_M'),t.b

查询结果

------ 本文完 ------