尽管 TIMESTAMP
列值是以全部精度存储的,但是 UNIX_TIMESTAMP()
是唯一能直接操作内部存储值的函数。其它的函数操作的是格式化后的检索的值。这就意味着不能够使用诸如 HOUR()
或 SECOND()
之类的函数,除非相关部分存在于格式化后的 TIMESTAMP
值中。例如,在小于 10 的显示格式上,为了使 TIMESTAMP
列中的 HH
部分能够显示,显示格式的尺寸必须不小于 10,因此在一个更短的 TIMESTAMP
列值上使用 HOUR()
将会产生一个无意义的结果。
示例(译者注):
* 接上例结果
# 下列示例结果与上述结果相悖
mysql> ALTER TABLE `ta` CHANGE `date1` `date1` TIMESTAMP(4);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM `tA`;
+----+-------+
| id | date1 |
+----+-------+
| 1 | 0305 |
| 2 | 0003 |
| 3 | 0000 |
+----+-------+
3 rows in set (0.01 sec)
mysql> SELECT HOUR(`date1`) FROM `tA`;
+---------------+
| Hour(`date1`) |
+---------------+
| 15 |
| 0 |
| NULL |
+---------------+
3 rows in set (0.02 sec)
mysql> SELECT SECOND(`date1`) FROM `tA`;
+-----------------+
| second(`date1`) |
+-----------------+
| 42 |
| 0 |
| NULL |
+-----------------+
3 rows in set (0.01 sec)
* 以上结果在 MySQL 4.0.12 中测试
示例结束(译者注):
在某种程序上,你可以将一个日期值赋给另一种日期类型的对象。然而,这可能会使值产生改变或丢失一部分信息。
-
如果将一个
DATE
值赋给一个 DATETIME
或 TIMESTAMP
对象,结果值的时间部分将被设为 ''''00:00:00''''
,因为 DATE
值不包含时间信息。
-
如果将一个
DATETIME
或 TIMESTAMP
值赋给一个 DATE
对象,结果值的时间部分被删除,因为 DATE
类型不能存储时间信息。
-
记住,尽管
DATETIME
、DATE
和 TIMESTAMP
值全都可以用同样的格式集来指定,但所有类型不都有同有同样的值范围。例如,TIMESTAMP
值不能早于 1970
或晚于 2037
。这就意味着,一个日期例如 ''''1968-01-01''''
,作为一个 DATETIME
或 DATE
值是合法的,但不是一个有效的 TIMESTAMP
值,当它被赋于一个这样的对象时,它将被转换为 0
。
当指定日期值时,当心某些失误:
-
你可能会被以字符串指定值时所允许的宽松格式欺骗。例如,一个值如
''''10:11:12''''
的,因为分界符 “:” 可能看起来像是一个时间值, 但是当它被用于一个日期语境中时,它将被解释成为 ''''2010-11-12''''
年。而值 ''''10:45:15''''
将被转换成 ''''0000-00-00''''
,因为 ''''45''''
是一个不合法的月份。
-
MySQL 服务器仅对日期的有效性执行基本的检验:天为
00-31
,月为 00-12
,年为 1000-9999
。任何不是这个范围内的日期将被转换为 0000-00-00
。请注意,这仍然允许你存储一个无效的日期例如2002-04-31
。它允许一个 WEB 应用程序不进行进一步的检查而存储一个表单中的数据。为了确保一个日期值的有效性,在你的应用程序里执行有效性检查。
-
以两位数字指定年份是存在二义性的,因为世纪是未知的。MySQL 以下面的规则解释一个 2 位年份值:
-
00-69
范围的年份值被转换为 2000-2069
。
-
70-99
范围的年份值被转换为 1970-1999
。
6.2.2.3 TIME
类型
MySQL 以 ''''HH:MM:SS''''
格式(或对大的小时值时使用 ''''HHH:MM:SS''''
格式)检索和显示 TIME
值。TIME
值的范围可以从 ''''-838:59:59''''
到 ''''838:59:59''''
。小时部分可以这么大的原因 是,TIME
类型不仅可以用于表示一天的时间(这一定不会超过 24 小时),而且可以用来表示所经过的时间或两个事件之间的时间间隔(这可能比 24 小时大许多或是一个负值)。
TIME
值可以多种格式指定:
-
一个
''''D HH:MM:SS.fraction''''
格式的字符串。(注意,MySQL 仍然不能为时间列存储毫秒“fraction”)下面所示的任一种“宽松”的语法均可以被使用:HH:MM:SS.fraction
、HH:MM:SS
、HH:MM
、D HH:MM:SS
、D HH:MM
、D HH
或 SS
。这里的 D
是一个在 0-33 之间的日期。
-
一个无定界符的
''''HHMMSS''''
格式的字符串,只要字符串看起来像是一个时间。例如:''''101112''''
可被理解为 ''''10:11:12''''
,但是 ''''109712''''
是不合法的(它有一个无意义的分钟部分),当被插入时会转换为 ''''00:00:00''''
。
-
一个
HHMMSS
格式的数字,只要数字看起来像一个时间。例如,101112
可被理解为 ''''10:11:12''''
。下面的任一格式均可被正常理解:SS
、MMSS
、HHMMSS
、HHMMSS.fraction
。注意,MySQL 仍不能保存 毫秒(fraction)部分。
-
在一个
TIME
语境中,函数(例如 CURRENT_TIME
)的返回值将会返一个合理的格式。
对于以字符串指定的包含时间定界符的 TIME
值,不必要为小于 10
的时、分或秒指定 2 位数字。''''8:3:2''''
与 ''''08:03:02''''
是一致的。
将“短”的 TIME
值赋给另一个 TIME
列时要格外小心。如果没有冒号,MySQL 使用最右位代表秒的假设来解释值。(MySQL 将 TIME
值解释为经过的时间,而不是时刻)。例如,你可能会认为 ''''1112''''
and 1112
的意思就是 ''''11:12:00''''
(11 点过 12 分),但是 MySQL 却将它解释为 ''''00:11:12''''
(11 分,12 秒)。同样的,''''12''''
和 12
被解释为 ''''00:00:12''''
。有冒号的 TIME
值,由于冒号的存在,通常认为是处理过的时刻。这就是说,''''11:12''''
就意味着是 ''''11:12:00''''
,而不是 ''''00:11:12''''
。
如果值超出了 TIME
的范围,但是其它分、秒部分是合法的,它将被剪切到取值范围的适当端点。例如,''''-850:00:00''''
和 ''''850:00:00''''
将被分别转换为 ''''-838:59:59''''
和 ''''838:59:59''''
。
不合法的 TIME
值将被转换为 ''''00:00:00''''
。注意,因为 ''''00:00:00''''
自身是一个合法的 TIME
值,这就没有办法区分,存储在一个表中的 ''''00:00:00''''
,原来的值是否就是指定为 ''''00:00:00''''
或是一个不合法的值。
6.2.2.4 YEAR
类型
YEAR
类型是一个以 1 个字节描述年份的类型。
MySQL 以 YYYY
格式检索和显示一个 YEAR
值。范围是 1901
到 2155
。
可以以多个格式指定 YEAR
值:
-
一个在
''''1901''''
到 ''''2155''''
范围之内的 4 位字符串。
-
一个在
1901
到 2155
范围之内的 4 位数字。
-
一个在
''''00''''
到 ''''99''''
范围之内的 2 位字符串。''''00''''
到 ''''69''''
和 ''''70''''
到 ''''99''''
范围内的值将被分别转换到 2000
到 2069
和 1970
到 1999
范围内的 YEAR
值。
-
一个在
1
到 99
范围之内的数字。1
到 69
和 70
到 99
范围内的值将被分别转换到 2001
到 2069
和 1970
到 1999
范围内的 YEAR
值。注意,两位数字的范围与两位字符串的范围稍稍有点不同,因为你不能直接地以数字指定一个零值,将它解释为 2000
。你必须 以一个 ''''0''''
或 ''''00''''
格式的字符串指定它,否则它将被解释为 0000
。
-
在一个
YEAR
的语境中,函数(例如 NOW()
)的返回值将会返回一个合理的格式。
不合法的 YEAR
值将被转换为 0000
。
6.2.3 字符串类型
字符串类型有 CHAR
、VARCHAR
、BLOB
、TEXT
、ENUM
和 SET
。这个章节描述这些类型是如何工作的,它们的存储需求,以及在你的查询中如何使用它们。
类型 最大尺寸 字节
TINYTEXT
或 TINYBLOB
2^8-1 255
TEXT
或 BLOB
2^16-1 (64K-1) 65535
MEDIUMTEXT
或 MEDIUMBLOB
2^24-1 (16M-1) 16777215
LONGBLOB
2^32-1 (4G-1) 4294967295
6.2.3.1 CHAR
和 VARCHAR
类型
CHAR
和 VARCHAR
类型是很相似的,但是它们被存储与检索的方式有些不同。
一个 CHAR
列的长度被固定为你创建表进所声明的长度。长度可以是 1 和 255 之间的任一值。(从 MySQL 3.23 之后,CHAR
的长度可以是 0 到 255。)当 CHAR
值被存储时,他们被用空格在右边填补到指定长度。当 CHAR
值被检索时,尾部的空格被截除。
VARCHAR
列的值是变长的字符串。你可以声明一个 VARCHAR
列在 1 到 255, 就像对 CHAR
列一样。然而,与 CHAR
相反的,VARCHAR
值只以所需的字符数存储,另加一个字节存储记录的长度。值并不被填补;相反的,当被存储时,尾部的空格被截除。(这个截除空格方式不同于 ANSI SQL 规约。)
如果将一个超过列最大长度的值赋给一个 CHAR
或 VARCHAR
列,该值将截断以适合它。
下表通过在 CHAR(4)
和 VARCHAR(4)
列中存储不同的字符串的结果显示了两种类型列的不同:
值 CHAR(4)
存储需求 VARCHAR(4)
存储需求
''''''''
'''' ''''
4 字节 ''''''''
1 字节
''''ab''''
''''ab ''''
4 字节 ''''ab''''
3 字节
''''abcd''''
''''abcd''''
4 字节 ''''abcd''''
5 字节
''''abcdefgh''''
''''abcd''''
4 字节 ''''abcd''''
5 字节
在各种情况下,CHAR(4)
和 VARCHAR(4)
列的检索值均是一样的,因为在 CHAR
列上检索值的尾部空格会被截除。
CHAR
和 VARCHAR
列值以省略字母大小写的方式进行排序和比较,除非在表建立时 BINARY
属性被指定。BINARY
属性意味着,该列值根据 MySQL 服务器正在运行的机器的 ASCII 表顺序进行字母大小写敏感的方式排序和比较。BINARY
并不影响该列如何被存储和检索。
BINARY
属性是有粘性的。这就意味着,如果一个被标记为 BINARY
的列被用于一个表达式中,整个表达式将作为一个 BINARY
值被比较。
在表创建时,MySQL 可能会隐式地改变一个 CHAR
或 VARCHAR
列的类型。查看章节 6.5.3.1 隐式的列定义变化。
6.2.3.2 BLOB
和 TEXT
类型
一个 BLOB
是一个可以保存一可变数量的数据的二进制大对象。四个 BLOB
类型(TINYBLOB
、BLOB
、MEDIUMBLOB
和 LONGBLOB
)之间的不同仅仅在于他们能保存值的最大长度不一致。查看章节 6.2.6 列类型存储需求。
四个 TEXT
类型(TINYTEXT
、TEXT
、MEDIUMTEXT
和 LONGTEXT
)对应与四个 BLOB
类型,并且有相同的最大长度和存储需求。在 BLOB
和 TEXT
类型之间的唯一差别就是,对 BLOB
值是以字母大小写敏感的方式进行排序和比较的,而对 TEXT
值以忽略字母大小写方式进行排序和比较。换句话说,TEXT
是一个忽略字母大小写的 BLOB
。
如果将一个超过列类型最大长度的值赋给一个 BLOB
或 TEXT
列,该值将被截断以适应它。
在大多数方面,可以将一个 TEXT
列看作是一个你所希望大 VARCHAR
列。同样的,BLOB
列可以看作是一个 VARCHAR BINARY
列。差别就在于:
-
在 MySQL 3.23.2 和更新的版本中,可以在
BLOB
和 TEXT
列上建立索引。而较老版本的 MySQL 是不支持的。
-
当
BLOB
and TEXT
列值被存储时,尾部的空格不会被剪切,这与 VARCHAR
列是不一样的。
-
BLOB
和 TEXT
列不可以有 DEFAULT
值。
MyODBC
以 LONGVARBINARY
定义 BLOB
值,以 LONGVARCHAR
定义 TEXT
值。
因为 BLOB
上一页 [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数据库