则解释存在二义性的年份值:
-
在范围
00-69 内的年值被转换为 2000-2069 。
-
在范围Y
70-99 内的年值被转换为 1970-1999 。
记住,这些规则仅仅提供对于你的数据含义的合理猜测。如果 MySQL 使用的探索法无法得到正确的值,你应该以包含 4 位年份的格式提供一个明确的值。
ORDER BY 将以适当的顺序对 2 位 YEAR/DATE/DATETIME 类型排序。
注意,某些像 MIN() 和 MAX() 之类的函数会将 TIMESTAMP/DATE 转换为一个数字。这就意味着,一个 2 位年份的时间戳将完全不能与这些函数一同工作。在这种情况下,解决的办法是将 TIMESTAMP/DATE 转换为 4 位年份格式或者使用诸如 MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)) 的方法 。
6.2.2.2 DATETIME 、DATE 和 TIMESTAMP 类型
DATETIME 、DATE 和 TIMESTAMP 类型是相似的。这个章节描述了它们的特性以及它们的相似点与不同点。
DATETIME 类型可用于需要同时包含日期和时间信息的值。MySQL 以 ''''YYYY-MM-DD HH:MM:SS'''' 格式检索与显示 DATETIME 类型。支持的范围是 ''''1000-01-01 00:00:00'''' 到 ''''9999-12-31 23:59:59'''' 。(“支持”的含义是,尽管更早的值可能工作,但不能保证他们均可以。)
DATE 类型可用于需要一个日期值而不需要时间部分时。MySQL 以 ''''YYYY-MM-DD'''' 格式检索与显示 DATE 值。支持的范围是 ''''1000-01-01'''' 到 ''''9999-12-31'''' 。
TIMESTAMP 列类型提供了一种类型,通过它你可以以当前操作的日期和时间自动地标记 INSERT 或UPDATE 操作。如果一张表中有多个 TIMESTAMP 列,只有第一个被自动更新。
自动更新第一个 TIMESTAMP 列在下列任何条件下发生:
-
列值没有明确地在一个
INSERT 或 LOAD DATA INFILE 语句中被指定。
-
列值没有明确地在一个
UPDATE 语句中被指定,并且其它的一些列值已发生改变。(注意,当一个 UPDATE 设置一个列值为它原有值时,这将不会引起 TIMESTAMP 列的更新,因为,如果你设置一个列值为它当前值时,MySQL 为了效率为忽略更新。)
-
明确地以
NULL 设置 TIMESTAMP 列。
第一个列以外其它 TIMESTAMP 列,可以设置到当前的日期和时间,只要将该列赋值 NULL 或 NOW() 。
任何 TIMESTAMP 列均可以被设置一个不同于当前操作日期与时间的值,这通过为该列明确指定一个你所期望的值来实现。这也适用于第一个 TIMESTAMP 列。这个选择性是很有用的,举例来说,当你希望 TIMESTAMP 列保存该记录行被新添加时的当前的日期和时间,但该值不再发生改变,无论以后是否对该记录行进行过更新:
-
当该记录行被建立时,让 MySQL 设置该列值。这将初始化该列为当前日期和时间。
-
以后当你对该记录行的其它列执行更新时,为
TIMESTAMP 列值明确地指定为它原来的值。
另一方面,你可能发现更容易的方法,使用 DATETIME 列,当新建记录行时以 NOW() 初始化该列,以后在对该记录行进行更新时不再处理它。
示例(译者注):
mysql> CREATE TABLE `tA` (
-> `id` int(3) unsigned NOT NULL auto_increment,
-> `date1` timestamp(14) NOT NULL,
-> `date2` timestamp(14) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO `tA` SET `id` = 1;
Query OK, 1 row affected (0.02 sec)
# 没有明确地指定第一个 timestamp 列值,该列值被设为插入的当前时刻
# 没有明确地指定其它的 timestamp 列值,MySQL 则认为插入的是一个非法值,而该列值被设为0
mysql> INSERT INTO `tA` VALUES (2, NOW(), NULL);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM `tA`;
+----+----------------+----------------+
| id | date1 | date2 |
+----+----------------+----------------+
| 1 | 20030503104118 | 00000000000000 |
| 2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+
2 rows in set (0.00 sec)
mysql> UPDATE `tA` SET `id` = 3 WHERE `id` = 1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
# 对某一记录行进行了更新,第一个 timestamp 列值也将被更新
mysql> UPDATE `tA` SET `id` = 2 WHERE `id` = 2;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
# MySQL 忽略了这次操作,第一个 timestamp 列值不会被更新
mysql> SELECT * FROM `tA`;
+----+----------------+----------------+
| id | date1 | date2 |
+----+----------------+----------------+
| 3 | 20030503104538 | 00000000000000 |
| 2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+
2 rows in set (0.00 sec)
mysql> UPDATE `tA` SET `id` = 1,`date1`=`date1` WHERE `id` = 3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
# 明确地指定了第一个 timestamp 列值为它原有值,该值将不会被更新
mysql> SELECT * FROM `tA`;
+----+----------------+----------------+
| id | date1 | date2 |
+----+----------------+----------------+
| 1 | 20030503104538 | 00000000000000 |
| 2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+
2 rows in set (0.00 sec)
* 以上结果在 MySQL 4.0.12 中测试
示例结束(译者注)
TIMESTAMP 值可以从 1970 到 2037 之间的任一时刻,精度为一秒。其值作为数字显示。
MySQL 检索与显示 TIMESTAMP 值的格式取决于它的显示尺寸,描述如下表。“完整”的 TIMESTAMP 格式是 14 位的,但是 TIMESTAMP 列可以以一个更短的显示尺寸建立:
列类型 显示格式
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY
所有的 TIMESTAMP 列均有一个相同的存储尺寸,而不考虑显示尺寸的大小。最常见的显示尺寸为 6、8、12 和 14。你可以在表创建时指定一个任意的显示尺寸,但是值 0 或 比 14 大的值将会被强制定义为列长 14。在从 1 ~ 13 范围内的奇数会被强制为下一个更大的偶数。
例如(译者注):
字段定义 强制字段长度
TIMESTAMP(0) TIMESTAMP(14)
TIMESTAMP(15) TIMESTAMP(14)
TIMESTAMP(1) TIMESTAMP(2)
TIMESTAMP(5) TIMESTAMP(6)
注意:从 MySQL 4.1 开始,TIMESTAMP 以 ''''YYYY-MM-DD HH:MM:DD'''' 格式作为字符串返回。不同的时间戳长度不再被支持。
译者注:如果你你希望在 MySQL 4.1 中以数字形式返回时间戳,则必须在该时间戳字段后加上 +0。从 MySQL 4.0.12 开始,选项 --new 可以被用来使服务器与 4.1 一样运作。
你可以使用常用的格式集中的任何一个指定 DATETIME 、DATE 和 TIMESTAMP 值:
-
一个
''''YYYY-MM-DD HH:MM:SS'''' 或 ''''YY-MM-DD HH:MM:SS'''' 格式的字符串。一个“宽松”的语法是被允许的:以任何标点符号作为日期部分和时间部分中的定界符。例如,''''98-12-31 11:30:45'''' 、''''98.12.31 1+30+45'''' 、''''98/12/31 11*30*45'''' 和 ''''98@12@31 11^30^45'''' 均是等价的。
-
一个
''''YYYY-MM-DD'''' 或 ''''YY-MM-DD'''' 格式的字符串。这里,一个“宽松”的语法同样也是被允许的:例如,''''98.12.31'''' 、''''98-12-31'''' 、''''98/12/31'''' 和 ''''98@12@31'''' 是等价的。
-
一个无定界符的
''''YYYYMMDDHHMMSS'''' 或 ''''YYMMDDHHMMSS'''' 格式的字符串,只要字符串看起来像是一个日期。例如,''''19970523091528'''' 和 ''''970523091528'''' 均被解释为 ''''1997-05-23 09:15:28'''' ,但是 ''''971122129015'''' 却是违法的(它的分部分是无意义的),该值被插入时将变成 ''''0000-00-00 00:00:00'''' 。
-
一个无定界符的
''''YYYYMMDD'''' 或 ''''YYMMDD'''' 格式的字符串,只要字符串看起来像是一个日期。例如,''''19970523'''' 和 ''''970523'''' 被解释成为 ''''1997-05-23'''' ,但是 ''''971332'''' 却是违法的(它的月和日部分是无意义的),该值被插入时将变成 ''''0000-00-00'''' 。
-
一个
YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,只要数字看起来像是一个日期。例如,19830905132800 和 830905132800 被解释成为 ''''1983-09-05 13:28:00'''' 。
-
一个
YYYYMMDD 或 YYMMDD 格式的数字,只要数字看起来像是一个日期。例如,19830905 和 830905 被解释成为 ''''1983-09-05'''' 。
-
在一个
DATETIME 、DATE 或 TIMESTAMP 语境中,一个函数的返回值将随之而变化,例如 NOW() 或 CURRENT_DATE 。
非法的 DATETIME 、DATE 或 TIMESTAMP 值将会被转换到适当形式的“零”值(''''0000-00-00 00:00:00'''' 、''''0000-00-00'''' 或 00000000000000 )。
对于以字符串格式指定的包含日期定界符的值,不必要为小于 10 的月或天的值指定 2 位数字。''''1979-6-9'''' 等同于 ''''1979-06-09'''' 。同样的,对于以字符串指定的包含时间定界符的值,不必要为小于 10 的时、分或秒指定 2 位数字。''''1979-10-30 1:2:3'''' 等同于 ''''1979-10-30 01:02:03'''' 。
以数字指定的值应该是 6、8、12 或 14 位长。如果数字是 8 或 14 位长的,该值将被假定为年份是由头 4 位数字给出的 YYYYMMDD 或 YYYYMMDDHHMMSS 格式。如果数字是 6 或 12 数字长,它将被假定为年份是由头 2 位数字给出的 YYMMDD 或 YYMMDDHHMMSS 格式。不是这些长度之一的数字通过在值前补零到最接近的长度后解释。
以没有定界符的字符串格式指定的值通过它们给出的长度来解释。如果字符串是 8 或 14 个字符长,则假定年份由前 4 个字符给出。否则,年份由前 2 个字符给出。对于字符串中出现的多个部分,字符串以从左到右的顺序被解释,以找出年、月、日、时、分和秒值。这就意味着,你不就使用少于 6 个字符的字符串。例如,如果指定 ''''9903'''' ,你可能认为它代表 1999年3月,但你将会发现MySQL 会将一个“零”值插入到你的表中。这是因为,年份和月份分别为 99 和 03 ,但是日期部分丢失(为 0),因此这个值是不合法的。
TIMESTAMP 列总是以完全精度存储给定的合法值,而不考虑显示尺寸的大小。这包含几个含义:
-
赋值时总是给出年、月和日,即使你的列类型定义为
TIMESTAMP(4) 或 TIMESTAMP(2) 。否则,该值将是不合法的,而被 0 代替存储。
示例(译者注):
mysql> CREATE TABLE `tA` (
-> `id` int(3) unsigned NOT NULL auto_increment,
-> `date1` timestamp(4) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO `tA` (`id`,`date1`)
-> VALUES (1,NULL), # 插入当前日期和时间
-> (2,0305), # 以数字格式给出值,而值长度小于 6 ,在最左边补 0 至 6 位数字
-> (3,''''0305'''');# 以字符串格式给出值,而值长不包括年、月和日,因而是一个非法值
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 1
mysql> SELECT * FROM `tA`;
+----+-------+
| id | date1 |
+----+-------+
| 1 | 0305 |
| 2 | 0003 |
| 3 | 0000 |
+----+-------+
3 rows in set (0.00 sec)
* 以上结果在 MySQL 4.0.12 中测试
示例结束(译者注)
-
如果以
ALTER TABLE 拓展一个 TIMESTAMP 窄列,以前被“隐蔽”的信息将被显示出来。
示例(译者注):
* 接上例结果
mysql> ALTER TABLE `ta` CHANGE `date1` `date1` TIMESTAMP(11);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
# 设置 `date1` 为 TIMESTAMP(11),MySQL 会自动将其转化为 TIMESTAMP(11)
mysql> SELECT * FROM `tA`;
+----+--------------+
| id | date1 |
+----+--------------+
| 1 | 030503150142 |
| 2 | 000305000000 |
| 3 | 000000000000 |
+----+--------------+
3 rows in set (0.00 sec)
* 以上结果在 MySQL 4.0.12 中测上一页 [1] [2] [3] [4] [5] 下一页 [MySql]PHP存取 Mysql 数据乱码终极解决方案 [MySql]解决Table xxx is marked as crashed and should … [MySql][MySQL]快速解决"is marked as crashed and shoul… [MySql]MySQL DELETE语法用法详解 [MySql]mysql中时间日期格式化 [MySql]修改mysql导入文件大小限制 [其他]MySql常用命令大全 [Web开发]把ACCESS的数据导入到Mysql中的方法详解 [MySql]解决mysql 1040错误Too many connections的方法 [系统软件]利用crontab系统每天定时备份MySQL数据库
|