有时候我们需要对表的某个字段进行排序,比如标签 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量子计算机 靠后呢?这个在后面的章节会慢慢道来。