转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
MySQL的列类型(4)         ★★★★

MySQL的列类型(4)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:691 更新时间:2009/4/22 20:43:59

    L 以外所需的额外字节为存放该值的长度所需的字节数。MySQL通过存储值的内容及其长度来处理可变长度的值。这些额外的字节是无符号整数。请注意,可变长类型的最大长度、此类型所需的额外字节数以及占用相同字节数的无符号整数之间的对应关系。例如,
MEDIUMBLOB 值可能最多22 4 - 1字节长并需要3 个字节记录其结果。3 个字节的整数类型MEDIUMINT 的最大无符号值为22 4 - 1。这并非偶然。
    1. CHAR 和VARCHAR 列类型
    CHAR 和VARCHAR 是最常使用的串类型。它们是有差异的, CHAR 是定长类型而VARCHAR 是可变长类型。CHAR(M) 列中的每个值占M 个字节;短于M 个字节的值存储时在右边加空格(但右边的空格在检索时去掉)。VARCHAR(M) 列的值只用所必需的字节数来存放(结尾的空格在存储时去掉,这与ANSI SQL 的VARCHAR 值的标准不同),然后再加一个字节记录其长度。如果所需的值在长度上变化不大,则CHAR 是一种比VARCHAR 好的选择,因为处理行长度固定的表比处理行长度可变的表的效率更高。如果所有的值长度相同,由于需要额外的字节来记录值的长度,VARCHAR 实际占用了更多的空间。在MySQL3.23 以前,CHAR 和VARCHAR 列用最大长度为1到255 的M 来定义。从MySQL3.23 开始,CHAR(0) 也是合法的了。在希望定义一个列,但由于尚不知道其长度,所以不想给其分配空间的情况下, CHAR(0) 列作为占位符很有用处。以后可以用ALTE RTABLE 来加宽这个列。如果允许其为NULL,则CHAR(0) 列也可以用来表示o n / o ff 值。这样的列可能取两个值,NULL 和空串。CHAR(0) 列在表中所占的空间很小,只占一位。除少数情况外,在同一个表中不能混用CHAR 和VARCHAR。MySQL根据情况甚至会将列从一种类型转换为另一种类型。这样做的原因如下:
    ■ 行定长的表比行可变长的表容易处理(其理由请参阅2 . 3节“选择列的类型”)。
    ■ 表行只在表中所有行为定长类型时是定长的。即使表中只有一列是可变长的,该表的行也是可变长的。
    ■ 因为在行可变长时定长行的性能优点完全失去。所以为了节省存储空间,在这种情况下最好也将定长列转换为可变长列。这表示,如果表中有VARCHAR 列,那么表中不可能同时有CHAR 列;MySQL会自动地将它们转换为VARCHAR 列。例如创建如下一个表:

    请注意,VARCHAR 列的出现使MySQL将c1也转换成了VARCHAR 类型。如果试图用ALTER TABLE 将c1转换为CHAR,将不起作用。将VARCHAR 列转换为CHAR 的惟一办法是同时转换表中所有VARCHAR 列:

    BLOB 和TEXT 列类型像VARCHAR 一样是可变长的,但是它们没有定长的等价类型,因此不能在同一表中与BLOB 或TEXT 列一起使用CHAR 列。这时任何CHAR 列都将被转换为VARCHAR 列。定长与可变长列混用的情形是在CHAR 列短于4 个字符时,可以不对其进行转换。例如,MySQL不会将下面所创建的表中的CHAR 列转换为VARCHAR 列:

    短于4个字符的列不转换的原因是,平均情况下,不存储尾空格所节省的空间被VA R C HA R列中记录每个值的长度所需的额外字节所抵消了。实际上,如果所有列都短, MySQL将会把所定义的所有列从VARCHAR 转换为CHAR。MySQL这样做的原因是,这种转换平均来说不会增加存储需求,而且使表行定长,从而改善了性能。如果按如下创建一个表,VARCHAR 列全都会转换为CHAR 列:


    2. BLOB 与TEXT 列类型
    BLOB 是一个二进制大对象,是一个可以存储大量数据的容器,可以使其任意大。在MySQL中,BLOB 类型实际是一个类型系列( T I N Y B L O B、B L O B、M E D I U MB L O B、L O N G B L O B),除了在可以存储的最大信息量上不同外(请参阅表2 - 8),它们是等同的。
    MySQL还有一个TEXT 类型系列( T I N Y T E X T、T E X T、M E D I U M T E X T、L O N G T E X T)。除了用于比较和排序外,它们在各个方面都与相应的BLOB 类型等同,BLOB 值是区分大小写的,而TEXT 值不区分大小写。BLOB 和TEXT 列对于存储可能有很大增长的值或各行大小有很大变化的值很有用,例如,字处理文档、图像和声音、混合数据以及新闻文章等等。BLOB 或TEXT 列在MySQL3.23 以上版本中可以进行索引,虽然在索引时必须指定一个用于索引的约束尺寸,以免建立出很大的索引项从而抵消索引所带来的好处。除此之外,一般不通过查找BLOB 或TEXT 列来进行搜索,因为这样的列常常包含二进制数据(如图像)。常见的做法是用表中另外的列来记录有关BLOB 或TEXT 值的某种标识信息,并用这些信息来确定想要哪些行。使用BLOB 和TEXT 列需要特别注意以下几点:
    ■ 由于BLOB 和TEXT 值的大小变化很大,如果进行的删除和更新很多,则存储它们的
表出现高碎片率会很高。应该定期地运行OPTIMIZE TABLE 减少碎片率以保持良好的
性能。要了解更详细的信息请参阅第4章。
    ■ 如果使用非常大的值,可能会需要调整服务器增加max_allowed_packet 参数的值。详细的信息请参阅第11章“常规的MySQL管理”。如果需要增加希望使用非常大的值的客户机的块尺寸,可见附录E“MySQL程序参考”,该附录介绍了怎样对mysql和mysqldump 客户机进行这种块尺寸的增加。
    3. ENUM 和SET 列类型
  ENUM 和SET 是一种特殊的串类型,其列值必须从一个固定的串集中选择。它们之间的主要差别是ENUM 列值必须确实是值集中的一个成员,而SET 列值可以包括集合中任意或所有的成员。换句话说, ENUM 用于互相排斥的值,而S E T列可以从一个值的列表中选择多个值。
    ENUM 列类型定义了一个枚举。可赋予ENUM 列一个在创建表时指定的值列表中选择的成员。枚举可具有最多65 536 个成员(其中之一为MySQL保留)。枚举通常用来表示类别值。例如,定义为ENUM (“N”, “Y”) 的列中的值可以是“N”或“Y”。或者可将ENUM 用于诸如调查或问卷中的多项选择问题,或用于某个产品的可能尺寸或颜色等:

    如果正在处理Web 页中的选择,那么可以利用ENUM 来表示站点访问者在某页上的互相排斥的单选钮集合中进行的选择。例如,如果运行一个在线比萨饼订购服务系统,可用ENUM 来表示顾客订购的比萨饼形状:

    如果枚举类别表示计数,在建立该枚举时最重要的是选择合适的类别。例如,在记录实验室检验中白血球的数目时,可能会将计数分为如下的几组:

    在某个测试结果以精确的计数到达时,要根据该值所属的类别来记录它。但如果想将列从基于类别的ENUM 转换为基于精确计数的整数时,不可能恢复原来的计数。在创建SET 列时,要指定一个合法的集合成员列表。在这种意义上, SET 类型与ENUM是类似的。但是SET 与ENUM 不同,每个列值可由来自集合中任意数目的成员组成。集合中最多可有64 个成员。对于值之间互斥的固定集合,可使用SET 列类型。例如,可利用SET 来表示汽车的可用选件,如下所示:

    然后,特定的SET 值将表示顾客实际订购哪些选件,如下所示:

  空串表示顾客未订购任何选件。这是一个合法的SET 值。SET 列值为单个串。如果某个值由多个集合成员组成,那么这些成员在串中用逗号分隔。显然,这表示不应该用含有逗号的串作为SET 成员。SET 列的其他用途是表示诸如病人的诊断或来自Web 页的选择结果这样的信息。对于诊断,可能会有一个向病人提问的标准症状清单,而病人可能会表现出某些症状或所有的症状。对于在线比萨饼服务系统,用于订购的Web 页应该具有一组复选框,用来表示顾客想在比萨饼上加的配料。对ENUM 或SET 列的合法值列表的定义很重要,例如:
  ■ 正如上面所介绍的,此列表决定了列的可能合法值。
  ■ 可按任意的大小写字符插入ENUM 或SET 值,但是列定义中指定的串的大小写字符决定了以后检索它们时的大小写。例如,如果有一个ENUM (“Y”, “N”) 列,但您在其中存储了“ y”和“n”,当您检索出它们时显示的是“ Y”和“N”。这并不影响比较或排序的状态,因为ENUM 和SET 列是不区分大小写的。
  ■ 在ENUM 定义中的值顺序就是排序顺序。SET 定义中的值顺序也决定了排序顺序,但是这个关系更为复杂,因为列值可能包括多个集合成员。
  ■ SET 定义中的值顺序决定了在显示由多个集合成员组成的SET 列值时,子串出现的顺序。
  ENUM 和SET 被归为串类型是由于在建立这些类型


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台