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

全部博文(609)

文章存档

2010年(13)

2009年(39)

2008年(558)

我的朋友

分类: Mysql/postgreSQL

2008-09-05 20:47:32

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

  放,因此SET 列的存储大小是由集合成员的数目决定的,最多64 个成员。对于大小为1到8、9 到16、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 uc h”被放弃,因为它不是集合的成员。其次,以后检索这个值时,显示为“ table, chair”。之所以这样是因为MySQL针对所赋的值的每个子串决定各个二进制位并在存储值时将它们置为1。“c o uc 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。如果两者都不指定,缺省值为NULL。但是定义某个串列为NOT NULL 并不阻止其取空串。空值不同于遗漏的值,因此,不要错误地认为可以通过定义NOT NULL 来强制某个串列只包含非空的值。如果要求串值非

  空,那么这是一个在应用程序中必须强制实施的约束条件。

   还可以对除BLOB 和TEXT 类型外的所有串列类型用D E FA U LT 属性指定一个缺省值。如果不指定缺省值, MySQL会自动选择一个。对于可以包含NULL 的列,其缺省值为NULL。对于不能包含NULL 的列,除ENUM 列外都为空串,在ENUM 列中,缺省值为第一个枚举成员(对于SET 类型,在相应的列不能包含NULL 时其缺省值实际上是空集,不过这里空集等价于空串)。

  2.2.4 日期和时间列类型

   MySQL提供了几种时间值的列类型,它们分别是: DATE、DATE TIME、TIME、TIMES TAMP 和YEAR。表2-9 给出了MySQL为定义存储日期和时间值所提供的这些类型,并给出了每种类型的合法取值范围。YEAR 类型是在MySQL3.22版本中引入的。其他类型在所有MySQL版本中都可用。每种时间类型的存储需求见表2 - 10。每个日期和时间类型都有一个“零”值,在插入该类型的一个非法值时替换成此值,见表2 - 11。这个值也是定义为NOT NULL 的日期和时间列的缺省值。




  MySQL表示日期时根据ANSI 规范首先给出年份。例如,1999 年12 月3 日表示为“1999 - 12 - 0 3”。MySQL允许在输入日期

   时有某些活动的余地。如能将两个数字的年份转换成四位数字的年份,而且在输入小于10 的月份和日期时不用输入前面的那位数字。但是必须首先给出年份。平常经常使用的那些格式,如“ 12 / 3 / 9 9”或“3 / 12 / 9 9”,都是不正确的。MySQL使用的日期表示规则请参阅“处理日期和时间列”小节。时间值按本地时区返回给服务器; MySQL对返回给客户机的值不作任何时区调整。

  1. DATE、TIME 和DATETIME 列类型DATE、TIME 和DATETIME 类型存储日期、时间以及日期和时间值的组合。其格式为“YYYY - MM - DD”、“h h : m m : s s”和“YYYY - MM - DD hh:mm:ss”。对于DATETIME 类型,日期和时间部分都需要;如果将DATE 值赋给DATETIME 列,MySQL会自动地追加一个为“0 0 : 0 0 : 0 0”的时间部分。MySQL对DATETIME 和TIME 表示的时间在处理上稍有不同。对于DATETIME ,时间部分表示某天的时间。而TIME 值表示占用的时间(这也就是为什么其取值范围如此之大而且允许取负值的原因)。用TIME 值的最右边部分表示秒,因此,如果插入一个“短”(不完全)的时间值,如“12 : 3 0”到TIME 列,则存储的值为“ 0 0 : 12 : 3 0”,即被认为是“12 分30 秒”。如果愿意,也可用TIME 列来表示天的时间,但是要记住这个转换规则以免出问题。为了插入一个“12 小时30 分钟”的值,必须将其表示为“ 12 : 3 0 : 0 0”。

  2. TIMESTAMP 列类型

  TIMES TAMP 列以YYYYMMDDhhmmss 的格式表示值,其取值范围从19700101000000到2037 年的某个时间。此取值范围与UNIX 的时间相联系,在UNIX 的时间中,1970 年的第一天为“零天”,也就是所谓的“新纪元”。因此1970 年的开始决定了T I M E S TAMP 取值范围的低端。其取值范围的上端对应于UNIX 时间上的四字节界限,它可以表示到2037年的值。(TIMES TAMP 值的上限将会随着操作系统为扩充UNIX 的时间值所进行的修改而增加。这是在系统库一级必须提及的。MySQL也将利用这些更改。)TIMES TAMP 类型之所以得到这样的名称是因为它在创建或修改某个记录时,有特殊的记录作用。如果在一个TIMES TAMP 列中插入NULL,则该列值将自动设置为当前的日期和时间。在建立或更新一行但不明确给TIMES TAMP 列赋值时也会自动设置该列的值为当前的日期和时间。但是,仅行中的第一个TIMES TAMP 列按此方式处理,即使是行中第一个TIMESTAMP列,也可以通过插入一个明确的日期和时间值到该列(而不是NULL)使该处理失效。


  TIMES TAMP 列的定义可包含对最大显示宽度M 的说明。表2 - 12给出了所允许的M 值的显示格式。如果TIMES TAMP 定义中省略了M 或者其值为0或大于14,则该列按TIMES TAMP(14) 处理。取值范围从1到13的M 奇数值作为下一个更大的偶数值处理。T I M E S TAMP 列的显示宽度与存储大小或存储在内部的值无关。TIMES TAMP 值总是以4 字节存放并按14 位精度进行计算,与显示宽度无关。为了明白这一点,按如下定义一个表,然后插入一些行,进行检索:
阅读(1091) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~