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

全部博文(609)

文章存档

2010年(13)

2009年(39)

2008年(558)

我的朋友

分类: Mysql/postgreSQL

2008-09-05 20:52:38

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


  从表面上看,出现的行排序有误,第一列中的值全都相同,所以似乎排序是根据第二列中的值进行的。这个表面反常的结果是由于事实上, MySQL是根据插入T I M E S TAMP 列的全部14 位值进行排序的。MySQL没有可在记录建立时设置为当前日期和时间、并从此以后保持不变的列类型。如果要实现这一点,可用两种方法来完成:

  ■ 使用T I M E S TAMP 列。在最初建立一个记录时,设置该列为NULL,将其初始化为当前日期和时间:


  在以后无论何时更改此记录,都要明确地设置此列为其原有的值。赋予一个明确的值使时间戳机制失效,因为它阻止了该列的值自动更新:


  ■ 使用DATETIME 列。在建立记录时,将该列的值初始化为NOW( ):


  无论以后何时更新此记录,都不能动该列:UPDATEtbl_name SET /* angthing BUT dt_col here */ WHERE ...如果想利用T I M E S TAMP 列既保存建立的时间值又保存最后修改的时间值,那么可用一个T I M E S TAMP 列来保存修改时间值,用另一个T I M E S TAMP 列保存建立时间值。要保证保存修改时间值的列为第一个T I M E S TA M P,从而在记录建立或更改时自动对其进行设置。使保存建立时间值的列为第二个T I M E S TA M P,并在建立新记录时将其初始化为NOW( )。这样第二个T I M E S TAMP 的值将反映记录建立时间,而且以后将不再更改。

  3. YEAR 列类型

  YEAR 是一个用来有效地表示年份值的1个字节的列类型。其取值范围为从1901到2 15 5。在想保存日期信息但又只需要日期的年份时可使用YEAR 类型,如出生年份、政府机关选举年份等等。在不需要完全的日期值时, YEAR 比其他日期类型在空间利用上更为有效。

  YEAR 列的定义可包括显示宽度M 的说明,显示宽度应该为4 或2。如果YEAR 定义中省略了M,其缺省值为4。TINYINT 与YEAR 具有相同的存储大小(一个字节),但取值范围不同。要使用一个整数类型且覆盖与YEAR 相同的取值范围,可能需要SMALLINT 类型,此类型要占两倍的空间。在所要表示的年份取值范围与YEAR 类型的取值范围相同的情况下, YEAR 的空间利用率比SMALLINT 更为有效。YEAR 相对整数列的另一个优点是MySQL将会利用MySQL的年份推测规则把2 位值转换为4 位值。例如,97 与14 将转换为1997 和2 0 14。但要认识到,插入数值00 将得到0000 而不是2 0 0 0。如果希望零值转换为2 0 0 0,必须指定其为串“0 0”。



  4. 日期和时间列类型的属性没有专门针对日期和时间列类型的属性。通用属性NULL 和NOT NULL 可用于任意日期和时间类型。如果NULL 和NOT NULL 两者都不指定,则缺省值为NULL。也可以用DEFA ULT 属性指定一个缺省值。如果不指定缺省值,将自动选择一个缺

  省值。含有NULL 的列的缺省值为NULL 。否则,缺省值为该类型的“零”值。

  5. 处理日期和时间列MySQL可以理解各种格式的日期和时间值。DATE 值可按后面的任何一种格式指定,其中包括串和数值形式。表2 - 13为每种日期和时间类型所允许的格式。两位数字的年度值的格式用“歧义年份值的解释”中所描述的规则来解释。对于有分隔

  符的串格式,不一定非要用日期的“ -”符号和时间的“ :”符号来分隔,任何标点符号都可用作分隔符,因为值的解释取决于上下文,而不是取决于分隔符。例如,虽然时间一般是用分隔符“:”指定的,但MySQL 并不会在一个需要日期的上下文中将含有“ :”号的值理解成时间。此外,对于有分隔符的串格式,不需要为小于10 的月、日、小时、分钟或秒值指定两个数值。下列值是完全等同的:

  请注意,有前导零的值根据它们被指定为串或数有不同的解释。串“ 0 0 12 3 1”将视为一个六位数字的值并解释为DATE 的“2 0 0 0 - 12 - 3 1”和DATETIME 的“2000-12-3100:00:00”。而数0 0 12 3 1被认为12 3 1,这样的解释就有问题了。这种情形最好使用串值,或者如果要使用数值的话,应该用完全限定的值(即, DATE 用2 0 0 0 12 3 1,DATETIME 用2 0 0 0 12 3 10 0 0 0)。通常,在DATE、DATETIME 和T I M E S TAMP 类型之间可以自由地赋值,但是应该记住以下一些限制:

  ■ 如果将DATETIME 或T I M E S TAMP 值赋给DATE,则时间部分被删除。

  ■ 如果将DATE 值赋给DATETIME 或T I M E S TA M P,结果值的时间部分被设置为零。

   ■ 各种类型具有不同的取值范围。T I M E S TAMP 的取值范围更受限制( 1970 到2 0 3 7),因此,比方说,不能将1970 年以前的DATETIME 值赋给T I M E S TAMP 并得到合理的结果。也不能将2037 以后的值赋给TIMES TAMP。MySQL提供了许多处理日期和时间值的函数。要了解更详细的信息请参阅附录C。

  6. 歧义年份值的理解

  对于所有包括年份部分的日期和时间类型( DATE、DATE TIME、TIME STAMP、YEAR),MySQL将两位数字的年份转换为四位数字的年份。这个转换根据下列规则进行(在MySQL4.0 中,这些规则稍有改动,其中69 将转换为1969 而不是2069。这是根据X/Open UNIX 标准规定的规则作出的改动):

  ■ 00 到69 的年份值转换为2000 到2069。

  ■ 70 到99 的年份值转换为1970 到1999。

  通过将不同的两位数字值赋给一个YEAR 列然后进行检索,可很容易地看到这些规则的效果。下面是检索程序:



  请注意,00 转换为0000 而不是2 0 0 0。这是因为0 是YEAR 类型的一个完全合法的值;如果插入一个数值,得到的就是这个结果。要得到2 0 0 0,应该插入串“ 0”或“0 0”。可通过C O N C AT( ) 插入YEAR 值来保证MySQL得到一个串而不是数。C O N C AT( ) 函数不管其参数是串或数值,都返回一个串结果。请记住,将两位数字的年份值转换为四位数字的年份值的规则只产生一种结果。在未给

  定世纪 的情况下,MySQL没有办法肯定两位数字的年份的含义。如果MySQL的转换规则不能得出您所希望的值,解决的方法很简单:即用四位数字输入年份值。 MySQL有千年虫问题吗?MySQL自身是没有2000 年问题的,因为它在内部是按四位数年份存储日期值的,并且由用户负责提供恰当的日期值。两位数字年份解释的实际问题不是MySQL带来的,而是由于有的人 想省事,输入歧义数据所引起的问题。如果您愿意冒险,可以继续这样做。在您冒险的时候,MySQL的猜测规则是可以使用的。但要意识到,很多时候您确实需 要输入四位数字的年份。例如, p r e s i d e n t表列出了1700 年以来的美国总统,所以在此表中录入出生与死亡日期需要四位的年份值。这些列中的年份值跨了好几个世纪,因此,让MySQL从两位数字的年份去猜测是哪个 世纪是不可能的。

阅读(1061) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~