中文字符集及排序

来自Wikioe
跳到导航 跳到搜索


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 不能处理,这导致了后来 GBKGB 18030 汉字字符集的出现。
  • GB 2312 对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有 94 个汉字/符号,分别对应第一字节和第二字节。这种表示方式也称为区位码:
    1. 01-09 区为特殊符号。
    2. 16-55 区为一级汉字(常用汉字),按拼音排序
    3. 56-87 区为二级汉字(非常用汉字),按部首/笔画排序


Big5:由台湾财团法人信息产业策进会为五大中文套装软件(并因此得名Big-5)所设计的中文共通内码,在1983年12月完成公告。为繁体字编码(GB2312又不含繁体字)。


GBK:“Chinese Internal Code Specification”,即“汉字内码扩展规范”【K 为汉语拼音 Kuo Zhan(扩展)中“扩”字的声母】。

  • GBK 共收入 21886 个汉字和图形符号(向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准),包括:
    1. GB 2312 中的全部汉字、非汉字符号。
    2. BIG5 中的全部汉字。
    3. 与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
    4. 其它汉字、部首、符号,共计 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”全面)
  • 存在多音字的问题。


不修改原数据的字符集:

  1. 在查询语句的“order by”部分,使用“CONVERT()”函数:
    select * from dept order by CONVERT(name USING gbk);
    
  2. 在查询语句的“order by”部分,使用“hex()”函数转换为16进制编码:【???这样可以,神奇的网友】
    select * from dept order by hex(name);
    


修改列字符集:

  1. 将字段的字符集改成“gbk”,然后直接使用“order by”排序即可:
    ...
      'name' char(10) CHARACTER SET gbk DEFAULT NULL,”。
    ...
    
    • mysql 5.x支持某列单独定义字符集。
  2. 修改列字符集:向列定义添加“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、语句)。
    1. 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;
      
    2. 语句级别设置排序方式:
      按照笔划排序:
      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');
      
    3. 修改系统参数(数据库所在操作系统):
      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