ITPub博客

涂抹MySQL--第6章 开源运动与开源软件MySQL - 6.1字符集和校对规则

原创 作者:junsansi 时间:2014-07-15 14:40:28 0 删除 编辑

字符集这个东西对于数据库中存储的数据来说非常之重要,特别是对于中文环境这类多字节编码的字符尤其特殊,设置不当就极有可能遇到乱码的情况。基于此,尽管我完全理解大家恨不能马上就进入到MySQL数据库中,施展拳脚的急迫心情,不过在此之前,我觉着还是有必要先让大家认识MySQL中的字符集设定。下面三思简单通过三五个(///)字跟大家阐述一下,MySQL数据库中的字符集概念和应用。

本章文字内容较多,对于有失眠/多动症/拖延症/强迫症等症状的朋友应有所帮助,欢迎大家对号入座,走过路过不错过。另外,为了更好的促进您中午的睡眠,友情推荐大家可以在午饭后阅读,根据三思本人在营养学方面的造诣,饭后肠胃蠕动所耗费的大量能量,会使得大脑供氧有明显下降,值此大脑昏沉之际研讨枯燥文字,哎呀,想不睡着都难呐~

6.1 基础扫盲

提到字符集(Character Set),我们首先一定要搞明白,“字符集”到底是针对什么,应该怎么理解,我觉着很多人对这个问题模模糊糊的根本原因,实际上就是没能正确理解“字符集”的根本含义。

做为光荣的社会主义无产阶级接班人(俗称屌丝),我们首先拿起马列主义、毛泽东思想等重要武器,高举三个代表的伟大旗帜深入认识和学习一下字符集这个概念,思想的力量是巨大的,带表的成就感是非凡的。可是,我们毕竟年纪轻资历浅,短时间内无法消化和理解,不得已,只好再尝试从最简单的语法上分析,字符集针对的是什么,这个时候一定要注意了,接下来面对的是实际问题,千万不要想的过于复杂,就从最简单的字面意义理解就好。

那么所谓字符集,针对的是“字符”,这样说对不对呢,绝对没有问题。但是也要正确的理解"字符"的概念,提到字符那么很多人会想什么不是字符呢,"abc"是字符,"123"也是字符,本书中出现的每个符号都是字符。MySQL中的所谓字符集设置,是针对这些字符吗,我可以负责任的告诉大家,不是,绝对不是。字符集中所谓的"字符"并不是指字符这个形容词,实际上说的是“字符”类型。

MySQL数据库提供了多种数据类型的支持,什么数值型、日期型、二进制类型等等都不需要设置字符集,MySQL数据库中所谓字符集设置,主要是指针对字符类型的设定,比如charvarchartext这类字符型的数据类型。读者朋友们,注意了,本章中当我们再提到字符集时(这里并不仅仅局限于MySQL数据库,其它如ORACLE/MSSQL/DB2等都是同理),如非特别注明,所说的均是指字符类型保存字符的格式。

MySQL数据库中对字符集设定的支持非常全面,即使相比ORACLE这种大型数据库软件也毫不逊色,甚至还更为灵活,它提供了多种粒度适应不同的场合和需求,用户可以在服务器、数据库、表甚至列一级进行设置,同时登录到MySQL数据库的会话及应用程序连接中也可以进行个性化设定,MySQL中的包括MyISAMMEMORY以及InnoDB等常用存储引擎均能支持。

大家必须要认识到,字符集并不仅仅对存储的数据有效,在客户端连接服务器端时也与字符集有关。这好像是废话,你想,即然存储的数据有字符集的因素,那么不管客户端准备查询还是保存这些数据,肯定也会与字符集有关系的。话是这么说对吧,但对于很多数据库管理员,他们其实更多是“数据库软件”的管理者,对其中存储的数据介入程度并不深,这种情况下呢,一般默认字符集就能够满足其操作需求,如果环境需要,不能使用默认的字符集,MySQL也提供了相应的方式,单独设置当前会话的字符集,后面具体小节中会讲到这一点。

好了,基本情况大家已经都了解了,接下来就让三思多花些笔墨描述,主动帮助大家kick到下一层梦镜,好让大家能够睡的更深沉。

6.1.1 关于字符集

先来明确最核心的概念性问题,数据库中的字符集究竟是什么?还是问字符集的问题,但是角度有所不同。其实简单讲在数据库看来,字符集就是各种字符编码的一个集合。对于数据库来说,即使是同一个字符,不同的字符集在处理时它的编码格式都有可能不同(废话啊,如果相同,那就没必要搞多种字符集了),那么问题紧跟着就来了,为什么要搞多种字符集呢,此事就说来话长了,不过考虑到咱这本书毕竟不是在做历史考据,太无关的事情扯进来,搞不好就把读者朋友们直接kickLimbo,那得坐多少站才能回的来啊,所以长话短说吧。

举个例子描述:同样是黑白肤色的大熊猫科动物,搁在大陆叫大熊猫,到台湾就说猫熊,到了美国又改叫panda,你要是跑非洲去,没有这种动物,可能都找不出对应的形容词(于是乱码了),对于熊猫来说它自身没发生什么变化,所产生的不同称谓的变化,实际上是与地域有很大关联,那么如果把当地拥有的各种词汇集合组成一本字典,对应过来的话,这个字典就是所谓的字符集了(此说并不严谨,本例仅为帮助理解)

如果要下一个更书面化的定义,那么,字符集就是指符号和字符编码的集合。

不同地方的字典当然有可能是不同的,甚至每本字典中的词汇量都不一致,找一本适合的字典非常重要,比如说你给不懂中文的美国朋友看熊猫俩字,它绝对不可能关联到那个毛茸茸的可爱的永远挂着黑眼圈的珍稀动物。

在数据库中应用字符集时,对于具体字符集的设置同理也非常的重要,为了能让字符正确的被保存,同时还能正确的被读取出来,到最终正确的显示给用户,这中间每一个环节都涉及到字符集(以及可能发生的转换),只有读和写时,会话所用字符集相互匹配(或者说兼容),最终显示的结果才会正确无误,否则,就会出现不希望看到,但可能又确实常见的现象:乱码。但是,不要怕,只要本章的内容认真阅读,深入理解,您就可以跟乱码说拜拜。

6.1.2 关于校对规则

MySQL数据库中提到字符集,有一个关联的关键词是绝对不可被忽略的,那就是校对规则(Collation),官方文档中对此所做的名词解释如下:校对规则:顾名思义,就是指定义的一种比较字符集中字符的规则。也有些资料中将其称为排序规则。

字符集想必大家已经理解,那么校对规则又是怎么一回事儿呢,上面提到的这些概念听起来比较抽象,那么三思还是通过示例来描述吧,应该能够更加清晰一些。

比如我们保存了下列字符到对象的某列中,有“A,B,a,b”四个字符,然后再为上述的每个字符都定义一个数值:A0表示,B1表示,a2表示,b3表示。

就这个例子来说,A做为一个符号,与其对应的0就是A的编码后的形式,上述这四个字符以及其编码形式的组合,就是前面所说的字符集。那么哪部分指的是校对规则呢,其实脑袋瓜稍灵活一点儿的此时应该也能猜出来,下面就让三思来揭晓迷底吧。

仍以上面的例子来说明,如果我们希望比较多个字符的值,最简单的方式当然就是按照定义好的规则直接对比其编码,按照前面定义的规则,由于01要小,因此我们说AB小,应用比较的这个规则,就是所谓的校对规则,说的简单点,校对规则的核心就是比较字符编码的方式。

前例中只应用了一项比较的规则,我们将这类最简单的,比较所有可能性的校对规则,称为二元(Binary)校对规则。还有些比较复杂的校对规则,比如说大小写等同的规则,在比较时,就需要首先将"a,b"视为等同于"A,B",而后再比较编码(相当于应用了两项规则),这种规则我们被之为大小写不敏感(case-insensitive)校对规则,与之对应当然也会有大小写敏感的校对规则,这类规则相对来说要比二元校对规则复杂。

       上面所提到的这两种规则,只是字符集的校对规则的最常见形式,实际上排序的规则很多很复杂,因为我们平常接触到的字符并不仅只是abcd这类单字节的英文字母,还包括单词,各种符号以及多字节的字符(更加复杂)等等,很多的校对规则都拥有一堆的规则,不仅仅是大小写不敏感,还有比如像汉字中的多音字等等,在真正的现实生活中,即使是声称具有高等智慧的人类处理这些有时候也晕头转向啊。比如像三思这种普通话堪称媲美某AV台播音员的人物,要是给扔到广东也立马变聋哑,您要是把我扔到美国......亲,我都准备好了,您什么时候扔。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-21

  • 博文量
    646
  • 访问量
    4068174