This Domain(Admin5.com) is for Sale:

My SQL数据库实用技术(08)

时间:2007-12-23  来源:不详  作者:迈克DB

放,因此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 列外都为空串,在ENUM 列中,缺省值为第一个枚举成员(对于SET 类型,在相应的列不能包含NULL 时其缺省值实际上是空集,不过这里空集等价于空串)。

看完这篇,您有何感觉呢?

文章评论

共有位Admini5网友发表了评论 查看完整内容

24小时热门信息