SQL编程思想:基于5种主流数据库代码实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人


2.3.5 中文的排序方式

在创建数据库或者表时,我们通常会指定一个字符集和排序规则。

字符集(Charset)决定了数据库能够存储哪些字符,比如ASCII字符集只能存储简单的英文、数字和一些控制字符,GB2312字符集可以存储中文,Unicode字符集能够支持世界上的各种文字。

排序规则(Collation)定义了字符集中字符的排序顺序,包括是否区分大小写、是否区分重音等。对于中文而言,排序方式与英文有所不同,中文通常需要按照拼音、偏旁部首或者笔画进行排序。

如果想要支持中文排序,最简单的方式就是使用支持中文排序的字符集和排序规则。如果使用的字符集和排序规则不满足我们的排序需求,可以通过其他方法实现。

Oracle默认使用AL32UTF8字符编码,中文按照偏旁部首进行排序。我们可以通过一个转换函数实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

其中,NLSSORT()是Oracle提供的一个系统函数,用于返回按照指定排序规则编码的字符序列,SCHINESE_PINYIN_M表示中文的拼音排序规则。查询返回的结果如下:

除按照拼音排序外,Oracle还支持按照偏旁部首(SCHINESE_RADICAL_M)以及笔画(SCHINESE_STROKE_M)进行中文排序。

MySQL 8.0默认使用utf8mb4字符编码,中文按照偏旁部首进行排序。我们可以通过一个转换函数实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

其中,CONVERT()是一个MySQL系统函数,用于转换数据的字符集编码,中文GBK字符集默认使用拼音进行排序。查询返回的结果和上面的Oracle示例相同。

Microsoft SQL Server中的字符集和排序规则是同一个概念,安装数据库时默认根据操作系统所在的区域进行设置,中国地区默认使用Chinese_PRC_CI_AS排序规则,中文按照偏旁部首进行排序。我们可以通过COLLATE关键字实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

其中,COLLATE表示按照某种排序规则进行排序,Chinese_PRC_CI_AI_KS_WS表示中文拼音排序规则。查询返回的结果和上面的Oracle示例一样。

Microsoft SQL Server也支持中文按照笔画进行排序(Chinese_PRC_Stroke_CI_AS)。

PostgreSQL默认使用UTF-8编码字符集,中文按照偏旁部首进行排序。我们可以通过COLLATE关键字实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

其中,COLLATE表示按照某种排序规则进行排序,zh_CN表示中文拼音排序规则。查询返回的结果和上面的Oracle示例一样。

SQLite默认使用UTF-8字符编码,中文按照偏旁部首进行排序,不支持其他的排序方式。