查看“中文字符集及排序”的源代码
←
中文字符集及排序
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:计算机基础]][[category:MySQL]][[category:Oracle]] == 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()'''”函数: #: '''<syntaxhighlight lang="xml"> select * from dept order by CONVERT(name USING gbk); </syntaxhighlight>''' # 在查询语句的“order by”部分,使用“'''hex()'''”函数转换为16进制编码:【???这样可以,神奇的网友】 #: '''<syntaxhighlight lang="xml"> select * from dept order by hex(name); </syntaxhighlight>''' 修改列字符集: # 将字段的'''字符集'''改成“gbk”,然后直接使用“order by”排序即可: #: '''<syntaxhighlight lang="xml"> ... 'name' char(10) CHARACTER SET gbk DEFAULT NULL,”。 ... </syntaxhighlight>''' #* mysql 5.x支持某列单独定义字符集。 # 修改列字符集:向'''列定义'''添加“'''binary'''”属性,使之作为二进制比较,【???这样可以】 #: '''<syntaxhighlight lang="xml"> ... 'name' char(10) DEFAULT NULL, ... 改为: ... 'name' char(10) binary DEFAULT NULL, ... </syntaxhighlight>''' * 前提是在安装mysql时安装了gbk字符集,不然会报错: *: <syntaxhighlight lang="xml"> 1115 - Unknown character set: 'gbk' </syntaxhighlight> *: 如果你使用源码编译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”支持的参数值: :{| class="wikitable" ! 排序方式 !! 描述 |- | SCHINESE_RADICAL_M || (针对简体中文)按照部首(第一顺序)、笔划(第二顺序)排序 |- | SCHINESE_STROKE_M || (针对简体中文)按照笔划(第一顺序)、部首(第二顺序)排序 |- | '''SCHINESE_PINYIN_M''' || (针对简体中文)按照拼音排序 |- | TCHINESE_RADICAL_M || (针对繁体中文)按照部首(第一顺序)、笔划(第二顺序)排序 |- | TCHINESE_STROKE_M || (针对繁体中文)按照笔划(第一顺序)、部首(第二顺序)排序 |- | BINARY_CI || 忽略大小写的排序 |} * “NLS_SORT”可以'''在不同层面设置排序方法'''(系统、Session、语句)。 *# Session级别的设置,修改 ORACLE 字段的默认排序方式: *#: <syntaxhighlight lang="xml"> 按拼音: 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; </syntaxhighlight> *# 语句级别设置排序方式: *#: <syntaxhighlight lang="xml"> 按照笔划排序: 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'); </syntaxhighlight> *# 修改系统参数(数据库所在操作系统): *#: <syntaxhighlight lang="xml"> 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 </syntaxhighlight>
返回至“
中文字符集及排序
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息