来源:http://www.nowamagic.net/academy/detail/32161508
有时候我们需要对表的某个字段进行排序,比如标签 tag。如果 tag 包含中英文,那么就需要中英文混合排序。
排序目标是,英文就按首字母的 a,b,c 排,中文则按汉字的首字母排。
最简单的排序方法只需要一条 SQL 语句就可以完成:
01 | mysql> select tag, COUNT (tag) from news GROUP BY tag order by convert (tag using gbk) collate gbk_chinese_ci; |
02 | + -----------------+-----------------+ |
03 | | tag | COUNT (tag) | |
04 | + -----------------+-----------------+ |
05 | | .Net | 3 | |
06 | | 10000小时 | 1 | |
07 | | Amazon | 9 | |
08 | | android | 57 | |
09 | | C语言 | 1 | |
10 | | Dennis Ritchie | 2 | |
11 | | Go语言 | 5 | |
12 | | IT见解 | 146 | |
13 | | JavaScript | 4 | |
14 | | John McCarthy | 1 | |
15 | | JQuery | 7 | |
16 | | Zynga | 1 | |
17 | | 阿里巴巴 | 28 | |
18 | | 贝尔实验室 | 1 | |
19 | | 互联网 | 24 | |
20 | | 简明现代魔法 | 1 | |
21 | | 淘宝网 | 2 | |
22 | | 信息图 | 1 | |
23 | | 余额宝 | 11 | |
24 | | 支付宝 | 14 | |
25 | | 植物大战僵尸 | 4 | |
26 | | 自媒体 | 3 | |
27 | + -----------------+-----------------+ |
上面是按 gbk 字符集排序的,那么如果按 utf8 又如何呢?
01 | mysql> select tag, COUNT (tag) from news GROUP BY tag order by convert (tag using utf8) collate utf8_unicode_ci; |
02 | + -----------------+-----------------+ |
03 | | tag | COUNT (tag) | |
04 | + -----------------+-----------------+ |
05 | | .Net | 3 | |
06 | | 10000小时 | 1 | |
07 | | 12306 | 1 | |
08 | | C语言 | 1 | |
09 | | IT见解 | 146 | |
10 | | Quora | 4 | |
11 | | Twitch | 1 | |
12 | | Twitter | 19 | |
13 | | Zynga | 1 | |
14 | | 三星 | 3 | |
15 | | 专利 | 1 | |
16 | | 余额宝 | 11 | |
17 | | 开曼群岛 | 1 | |
18 | | 意志力 | 1 | |
19 | | 植物大战僵尸 | 4 | |
20 | | 注意力经济 | 1 | |
21 | | 简明现代魔法 | 1 | |
22 | | 诺基亚 | 12 | |
23 | | 诺贝尔奖 | 1 | |
24 | | 豆瓣 | 3 | |
25 | | 贝佐斯 | 1 | |
26 | | 贝尔实验室 | 1 | |
27 | | 轻博客 | 3 | |
28 | | 运营 | 1 | |
29 | | 量子计算机 | 1 | |
30 | | 黑莓 | 1 | |
31 | + -----------------+-----------------+ |
PS:ci是 case insensitive, 即 “大小写不敏感”, a 和 A 会在字符判断中会被当做一样的。
数字和引文排序是没问题,但为什么 H黑莓 会比 L量子计算机 靠后呢?这个在后面的章节会慢慢道来。