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

空串表示顾客未订购任何选件。这是一个合法的SET 值。SET 列值为单个串。如果某个值由多个集合成员组成,那么这些成员在串中用逗号分隔。显然,这表示不应该用含有逗号的串作为SET 成员。SET 列的其他用途是表示诸如病人的诊断或来自Web 页的选择结果这样的信息。对于诊断,可能会有一个向病人提问的标准症状清单,而病人可能会表现出某些症状或所有的症状。对于在线比萨饼服务系统,用于订购的Web 页应该具有一组复选框,用来表示顾客想在比萨饼上加的配料。对ENUM 或SET 列的合法值列表的定义很重要,例如:
■ 正如上面所介绍的,此列表决定了列的可能合法值。
■ 可按任意的大小写字符插入ENUM 或SET 值,但是列定义中指定的串的大小写字符决定了以后检索它们时的大小写。例如,如果有一个E N U M (“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 个集合值可按此方式存
放,因此SET 列的存储大小是由集合成员的数目决定的,最多64 个成员。对于大小为1 到8、9 到1 6、17 到2 4、25 到3 2、33 到64 个成员的集合,其SET 值分别占用1、2、3、4 或8个字节。
用一组二进制位来表示SET 正是允许SET 值由多个集合成员组成的原因。值中二进制位的任意组合都可以得到,因此,相应的值可由对应于这些二进制位的SET 定义中的串组合构成。下面给出一个说明SET 列的串形式与数值形式之间关系的样例;数值以十进制形式和二
进制形式分别给出:

如果给SET 列赋予一个含有未作为集合成员列出的子串的值,那么这些子串被删除,并将包含其余子串的值赋予该列。在赋值给SET 列时,子串不需要按定义该列时的顺序给出。但是,在以后检索该值时,各成员将按定义时的顺序列出。假如用下面的定义定义一个S E T列来表示家具:

如果给这个列赋予“ c h a i r, couch, table”值,那么,“c o u c h”被放弃,因为它不是集合的成员。其次,以后检索这个值时,显示为“ table, chair”。之所以这样是因为
MySQL 针对所赋的值的每个子串决定各个二进制位并在存储值时将它们置为1。“c o u c h”不对应二进制位,则忽略。在检索时,
MySQL 按顺序扫描各二进制位,通过数值值构造出串值,它自动地将子串排成定义列时给出的顺序。这个举动还表示,如果在一个值中不止一次地指定某个成员,但在检索时它也只会出现一次。如果将“ lamp, lamp,lamp”赋予某个SET 列,检索时也只会得出“l a m p”。
MySQL 重新对SET 值中的成员进行排序这个事实表示,如果用一个串来搜索值,则必须以正确的顺序列出各成员。如果插入“ c h a i r, table”,然后搜索“c h a i r, table”,那么将找不到相应的记录;必须查找“ table, chair”才能找到。ENUM 和SET 列的排序和索引是根据列值的内部值(数值值)进行的。下面的例子可能会显示不正确,因为各个值并不是按字母顺序存储的:


NULL 值排在其他值前(如果是降序,将排在其他值之后)。如果有一个固定的值集,并且希望按特殊的次序进行排序,可利用ENUM 的排序顺序。在创建表时做一个ENUM 列,并在该列的定义中以所想要的次序给出各枚举值即可。如果希望ENUM 按正常的字典顺序排序,可使用C O N C AT( ) 和排序结果将列转换成一个非ENUM 串,如下所示:

4. 串列类型属性
可对CHAR 和VARCHAR 类型指定B I N A RY 属性使列值作为二进制串处理(即,在比较和排序操作区分大小写)。
可对任何串类型指定通用属性NULL 和NOT NULL。如果两者都不指定,缺省值为N U L L。但是定义某个串列为NOT NULL 并不阻止其取空串。空值不同于遗漏的值,因此,不要错误地认为可以通过定义NOT NULL 来强制某个串列只包含非空的值。如果要求串值非
空,那么这是一个在应用程序中必须强制实施的约束条件。
还可以对除BLOB 和TEXT 类型外的所有串列类型用D E FA U LT 属性指定一个缺省值。如果不指定缺省值,
MySQL 会自动选择一个。对于可以包含NULL 的列,其缺省值为N U L L。对于不能包含NULL 的列,除ENUM 列外都