中文字符集及排序
跳到导航
跳到搜索
GB2312、GBK 与 GB18030
GB2312:GB 2312 或 GB 2312-80 是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称 GB 0,由中国国家标准总局发布,1981 年 5 月 1 日实施。GB 2312 编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持 GB 2312。
- GB 2312 标准共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的 682 个字符。
- GB 2312 的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75% 的使用频率。
- 对于人名、古汉语等方面出现的罕用字,GB 2312 不能处理,这导致了后来 GBK 及 GB 18030 汉字字符集的出现。
- GB 2312 对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有 94 个汉字/符号,分别对应第一字节和第二字节。这种表示方式也称为区位码:
- 01-09 区为特殊符号。
- 16-55 区为一级汉字(常用汉字),按拼音排序。
- 56-87 区为二级汉字(非常用汉字),按部首/笔画排序。
Big5:由台湾财团法人信息产业策进会为五大中文套装软件(并因此得名Big-5)所设计的中文共通内码,在1983年12月完成公告。为繁体字编码(GB2312又不含繁体字)。
GBK:“Chinese Internal Code Specification”,即“汉字内码扩展规范”【K 为汉语拼音 Kuo Zhan(扩展)中“扩”字的声母】。
- GBK 共收入 21886 个汉字和图形符号(向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准),包括:
- GB 2312 中的全部汉字、非汉字符号。
- BIG5 中的全部汉字。
- 与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
- 其它汉字、部首、符号,共计 984 个。
- GBK的文字编码是用双字节来表示的(不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成 1):
- 总体编码范围为“8140-FEFE”之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。
- 一级汉字:按拼音排序;二级汉字:按部首/笔画排序。
GB18030:国家标准 GB 18030-2005《信息技术中文编码字符集》,是中华人民共和国现时最新的内码字集,是 GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版。
- GB 18030 与 GB 2312-1980 和 GBK 兼容,共收录汉字70244个。
- 编码空间庞大,最多可定义 161 万个字符。
- 支持中国国内少数民族的文字,不需要动用造字区。
- 汉字收录范围包含繁体汉字以及日韩汉字
- GB 18030 编码是一二四字节变长编码:
- 单字节,其值从 0 到 0x7F,与 ASCII 编码兼容。
- 双字节,第一个字节的值从 0x81 到 0xFE,第二个字节的值从 0x40 到 0xFE(不包括0x7F),与 GBK 标准兼容。
- 四字节,第一个字节的值从 0x81 到 0xFE,第二个字节的值从 0x30 到 0x39,第三个字节从0x81 到 0xFE,第四个字节从 0x30 到 0x39。
- 按拼音排序。
GBK 和 GB18030 支持拼音排序,可能,其字符是按拼音的顺序进行编码的?
数据库中,如何对中文按拼音排序
数据库中,为了与其他语言通用,一般使用 Unicode 字符集的 utf8 实现(MySQL中的“utf8mb3”或“utf8mb4”),而其并不支持中文的拼音排序。
在不同的数据库实现中文按拼音排序的方式不同。
MySQL:按拼音排序
MySQL 使用“CONVERT()”函数将需要的列转换到中文字符集(如:“GB2312”、“GBK”、“GB18030”)来实现。
- (“GB2312”的一级汉字不支持拼音排序,“GBK”的一级汉字支持拼音,而“GBK”支持的汉字不如“GB18030”全面)
- 存在多音字的问题。
不修改原数据的字符集:
- 在查询语句的“order by”部分,使用“CONVERT()”函数:
select * from dept order by CONVERT(name USING gbk);
- 在查询语句的“order by”部分,使用“hex()”函数转换为16进制编码:【???这样可以,神奇的网友】
select * from dept order by hex(name);
修改列字符集:
- 将字段的字符集改成“gbk”,然后直接使用“order by”排序即可:
... 'name' char(10) CHARACTER SET gbk DEFAULT NULL,”。 ...
- mysql 5.x支持某列单独定义字符集。
- 修改列字符集:向列定义添加“binary”属性,使之作为二进制比较,【???这样可以】
... 'name' char(10) DEFAULT NULL, ... 改为: ... 'name' char(10) binary DEFAULT NULL, ...
- 前提是在安装mysql时安装了gbk字符集,不然会报错:
1115 - Unknown character set: 'gbk'
- 如果你使用源码编译MySQL,可以编译MySQL时使用“–with–charset=gbk”参数,这样MySQL就会直接支持中文查找和排序了(默认的是latin1)。也可以用“extra-charsets=gb2312,gbk,gb18030”来加入多个字符集。
Oracle:按拼音排序
Oracle 通过“NLS_SORT”参数来实现。
- Oracle9i 之前,中文是按照二进制编码进行排序的。在 oracle9i 中新增了按照拼音、部首、笔画排序功能。
- “NLS_SORT”是Oracle的初始化参数之一。根据官方文档的介绍,该参数“specifies the collating sequence for Order by queries”,也就是说,设置该参数是可以控制“SQL order by”语句显示结果顺序的依据的。
- “NLS_SORT”支持的参数值:
排序方式 描述 SCHINESE_RADICAL_M (针对简体中文)按照部首(第一顺序)、笔划(第二顺序)排序 SCHINESE_STROKE_M (针对简体中文)按照笔划(第一顺序)、部首(第二顺序)排序 SCHINESE_PINYIN_M (针对简体中文)按照拼音排序 TCHINESE_RADICAL_M (针对繁体中文)按照部首(第一顺序)、笔划(第二顺序)排序 TCHINESE_STROKE_M (针对繁体中文)按照笔划(第一顺序)、部首(第二顺序)排序 BINARY_CI 忽略大小写的排序
- “NLS_SORT”可以在不同层面设置排序方法(系统、Session、语句)。
- Session级别的设置,修改 ORACLE 字段的默认排序方式:
按拼音: alter session set nls_sort = SCHINESE_PINYIN_M; 按笔画: alter session set nls_sort = SCHINESE_STROKE_M; 按偏旁: alter session set nls_sort = SCHINESE_RADICAL_M; 忽略大小写: alter session set nls_sort = BINARY_CI; alter session set nls_comp = LINGUISTIC;
- 语句级别设置排序方式:
按照笔划排序: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M'); 按照部首排序: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M'); 按照拼音排序(此为系统的默认排序方式): select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M'); 忽略大小写: select * from dept order by nlssort(name,'NLS_SORT=BINARY_CI');
- 修改系统参数(数据库所在操作系统):
Linux shell: set NLS_SORT=SCHINESE_RADICAL_M ;export NLS_SORT Linux C shell: setenv NLS_SORT SCHINESE_RADICAL_M Windows 注册表: HKLC\SOFTWARE\ORACLE\home0\NLS_SORT
- Session级别的设置,修改 ORACLE 字段的默认排序方式: