Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2484695
  • 博文数量: 609
  • 博客积分: 10061
  • 博客等级: 上将
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-25 08:30
文章分类

全部博文(609)

文章存档

2010年(13)

2009年(39)

2008年(558)

我的朋友

分类: Mysql/postgreSQL

2008-09-05 20:42:50

Mysql入门系列:MySQL的列类型(6)

  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 被归为串类型是由于在建立这些类型的列时,枚举和集合成员被指定为串。但是,这些成员在内部存放时作为数值,而且同样可作为数值来处理。这表示ENUM 和S E T类型比其他的串类型更为有效,因为通常可用数值运算而不是串运算来处理它们。而且这还表示ENUM 和SET 值可用在串或数值的环境中。

  列定义中的ENUM 成员是从1开始顺序编号的。(0 被MySQL用作错误成员,如果以串的形式表示就是空串。)枚举值的数目决定了ENUM 列的存储大小。一个字节可表示256 个值,两个字节可表示65 536 个值。(可将其与一字节和两字节的整数类型T I N Y I N T、

  UNSIGNED 和SMALLINT UNSIGNED 进行对比。)因此,枚举成员的最大数目为65 536(包括错误成员),并且存储大小依赖于成员数目是否多于256 个。在ENUM 定义中,可以最多指定65 535(而不是65 536)个成员,因为MySQL保留了一个错误成员,它是每个枚举的隐含成员。在将一个非法值赋给ENUM 列时,MySQL自动将其换成错误成员。下面有一个例子,可用mysql客户机程序测试一下。它给出枚举成员的数值顺序,而且还说明了NULL 值无顺序编号:


 可对ENUM 成员按名或者按编号进行运算,例如:

  可以定义空串为一个合法的枚举成员。与列在定义中的其他成员一样,它将被赋予一个非零的数值。但是使用空串可能会引起某些混淆,因为该串也被作为数值为0 的错误成员。在下面的例子中,将非法的枚举值“ x”赋予ENUM 列引起了错误成员的赋值。仅在以数值

  形式进行检索时,才能够与空串区分开:


  SET 列的数值表示与ENUM 列的表示有所不同,集合成员不是顺序编号的。每个成员对应SET 值中的一个二进制位。第一个集合成员对应于0 位,第二个成员对应于1位,如此等等。数值SET 值0 对应于空串。SET 成员以位值保存。每个字节的8 个集合值可按此方式存
阅读(1109) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~