⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 06-2.html

📁 MySQL4.1.0 中文参考手册
💻 HTML
📖 第 1 页 / 共 5 页
字号:
* 以上结果在 MySQL 4.0.12 中测试
</PRE>
<tt>示例结束(译者注)</tt>

<P>
<CODE>REAL</CODE> 和 <CODE>DOUBLE PRECISION</CODE> 类型不接受精度规格说明。作为对 ANSI/ISO SQL92 标准的扩展,MySQL 接受 <CODE>DOUBLE</CODE> 作为 <CODE>DOUBLE PRECISION</CODE> 类型的一个同义词。标准要求 <CODE>REAL</CODE> 的精度比用于 <CODE>DOUBLE PRECISION</CODE> 的更小,而与之相反的,MySQL 以 8 字节的双精度浮点值(当不以“ANSI 模式”运行时)来实现两者。为了得到最大的可移植性, 近似数字的数值存储所需代码应该使用没有精度或小数位数规格说明的 <CODE>FLOAT</CODE> 或 <CODE>DOUBLE PRECISION</CODE> 类型。
</P>
<P>
当试图在一个数字列中存储一个超过该列允许范围的值时,MySQL 会剪切该值到范围内的适当端点值,并以结果值代替存储。
</P>

<P>
举例来说,一个整型列的范围是 <CODE>-2147483648</CODE> 到 <CODE>2147483647</CODE>。如果试图在一个 <CODE>INT</CODE> 列中插入值 <CODE>-9999999999</CODE>,该值将会被剪切到该范围的低部端点,以 <CODE>-2147483648</CODE> 代替存储。同样的,如果试图插入 <CODE>9999999999</CODE>,<CODE>2147483647</CODE> 将被代替存储。
</P>

<P>
如果 <CODE>INT</CODE> 列是 <CODE>UNSIGNED</CODE>的,列的范围大小是一致的,不过它的端点移动到了 <CODE>0</CODE> 和 <CODE>4294967295</CODE>。如果你试图存储 <CODE>-9999999999</CODE> 和 <CODE>9999999999</CODE>,而实际列中存储的值将会变成 <CODE>0</CODE> 和 <CODE>4294967296</CODE>。
</P>
<P>
对于 <CODE>ALTER TABLE</CODE>、<CODE>LOAD DATA INFILE</CODE>、<CODE>UPDATE</CODE> 和多行 <CODE>INSERT</CODE> 语句,由于剪切发生的转换,将以“Warnings”被报告。
</P>
<TABLE BORDER WIDTH="100%">
<TR><TD><STRONG>类型</STRONG> </TD><TD> <STRONG>占用字节</STRONG> </TD><TD> <STRONG>从</STRONG> </TD><TD> <STRONG>到</STRONG>
</TD></TR>
<TR><TD><CODE>TINYINT</CODE> </TD><TD> 1 </TD><TD> -128 </TD><TD> 127
</TD></TR>
<TR><TD><CODE>SMALLINT</CODE> </TD><TD> 2 </TD><TD> -32768 </TD><TD> 32767
</TD></TR>
<TR><TD><CODE>MEDIUMINT</CODE> </TD><TD> 3 </TD><TD> -8388608 </TD><TD> 8388607
</TD></TR>
<TR><TD><CODE>INT</CODE> </TD><TD> 4 </TD><TD> -2147483648 </TD><TD> 2147483647
</TD></TR>
<TR><TD><CODE>BIGINT</CODE> </TD><TD> 8 </TD><TD> -9223372036854775808 </TD><TD> 9223372036854775807
</TD></TR>
</TABLE>



<H3><A NAME="Date_and_time_types"></A>6.2.2  Date 和 Time 类型</H3>

<P>
<A NAME="IDX1062"></A>
<A NAME="IDX1063"></A>

</P>

<P>
日期和时间类型有 <CODE>DATETIME</CODE>、<CODE>DATE</CODE>、<CODE>TIMESTAMP</CODE>、<CODE>TIME</CODE> 和 <CODE>YEAR</CODE>。每一个类型均有合法值的范围,当给它们赋于一个真正不合法的值时,这些值将会被“零”代替。注意,MySQL 允许存储某个“不严格地”合法的日期,例如 <CODE>1999-11-31</CODE>。这样做的原因是,我们认为应用程序有责任来处理日期合法性的检查,而不是由 SQL 服务器来处理。为了“加快”对日期的检查,MySQL 仅检查月份应在 0-12 范围内,以及天在 0-31 范围内。因为上面所述的范围定义方式,MySQL 因而允许你在一个 <CODE>DATE</CODE> 或 <CODE>DATETIME</CODE> 列中存储日或月日均为 0 的日期。当一个应用程序希望存储一个出生日期,而你并不知准确的出生日月时,这将变得非常有用。在这种情况下,你可以简单地以 <CODE>1999-00-00</CODE> 或 <CODE>1999-01-00</CODE> 形式存储日期。(当然你不能期望 <CODE>DATE_SUB()</CODE> 或 <CODE>DATE_ADD</CODE> 之类的函数能正确地处理这样的日期,并得到正确的值。)

</P>
<P>
当使用日期和时间类型工作时,这里有一些要记住的总则:
</P>

<UL>
<LI>

MySQL 对一个给定的日期或时间类型以标准的格式进行检索,但是它会努力以各种格式匹配解释你所提供的(例如,当你指定一个值,将其赋给一个日期或时间类型或与之比较时)。然而,只在下面部分所描述的格式是被支持的。期望你能够提供合法的值,如果你使用其它格式的值,可能会造成无法预料的结果。

<LI>

尽管 MySQL 会尝试以各种格式解释值,它通常期望日期的年部分放在最左边。日期必须以年-月-日次序给出(例如, <CODE>'98-09-04'</CODE>),而不是其它地方常用的月-日-年或日-月-年次序(例如,<CODE>'09-04-98'</CODE>、<CODE>'04-09-98'</CODE>)。

<LI>

如果一个值被用于在数字的语境中,MySQL 将自动地将一个日期或时间类型值转换成数字,反之亦然。

<LI>

当 MySQL 遇到一个日期或时间类型的值超出范围或对该类型是一个不合法的值时(查看这个章节的开头部分),它会将该类型的值变换到“零”值。(例外的是超出范围的 <CODE>TIME</CODE> 值将被剪切为适当的 <CODE>TIME</CODE> 范围端点值。) 下表每种类型的“零”值格式:

<TABLE BORDER WIDTH="95%">
<TR><TD><STRONG>列类型 </STRONG> </TD><TD> <STRONG>“零”值 </STRONG>
</TD></TR>
<TR><TD><CODE>DATETIME</CODE> </TD><TD> <CODE>'0000-00-00 00:00:00'</CODE>
</TD></TR>
<TR><TD><CODE>DATE</CODE> </TD><TD> <CODE>'0000-00-00'</CODE>
</TD></TR>
<TR><TD><CODE>TIMESTAMP</CODE> </TD><TD> <CODE>00000000000000</CODE> (长度取决于显示格式)
</TD></TR>
<TR><TD><CODE>TIME</CODE> </TD><TD> <CODE>'00:00:00'</CODE>
</TD></TR>
<TR><TD><CODE>YEAR</CODE> </TD><TD> <CODE>0000</CODE>
</TD></TR>
</TABLE>

<LI>

“零”值是特殊的,但是你可以以表中显示的值来明确地存储或引用他们。你也可以使用值<CODE>'0'</CODE> 或 <CODE>0</CODE>,这更易于书写。

<LI>

在 <CODE>MyODBC</CODE> 2.50.12 和以上的版本中,“零”值的日期和时间值通过 <CODE>MyODBC</CODE> 将被自动转换成 <CODE>NULL</CODE>,因为 ODBC 不能够处理这样的值。
</UL>



<H4><A NAME="Y2K_issues"></A>6.2.2.1  Y2K 问题和日期类型</H4>

<P>
<A NAME="IDX1064"></A>
<A NAME="IDX1065"></A>

</P>
<P>
MySQL 自身是 Y2K 安全的(查看章节  <A HREF="manual1.html#Year_2000_compliance">1.2.5  2000 年兼容性</A>),但是呈交给 MySQL 的值可能并不是。任何一个包含 2 位年份的值是存在二义性的,因为世纪值是未知的。这样的值必须被解释为 4 位格式,因为 MySQL 内部使用四位存储年份。
</P>

<P>
对于 <CODE>DATETIME</CODE>、<CODE>DATE</CODE>、<CODE>TIMESTAMP</CODE> 和 <CODE>YEAR</CODE> 类型,MySQL 使用下列规则解释存在二义性的年份值:
</P>

<UL>
<LI>

在范围 <CODE>00-69</CODE> 内的年值被转换为 <CODE>2000-2069</CODE>。

<LI>

在范围Y <CODE>70-99</CODE> 内的年值被转换为 <CODE>1970-1999</CODE>。
</UL>

<P>
记住,这些规则仅仅提供对于你的数据含义的合理猜测。如果 MySQL 使用的探索法无法得到正确的值,你应该以包含 4 位年份的格式提供一个明确的值。
</P>

<P>
<CODE>ORDER BY</CODE> 将以适当的顺序对 2 位 <CODE>YEAR/DATE/DATETIME</CODE> 类型排序。
</P>

<P>
注意,某些像 <CODE>MIN()</CODE> 和 <CODE>MAX()</CODE> 之类的函数会将 <CODE>TIMESTAMP/DATE</CODE> 转换为一个数字。这就意味着,一个 2 位年份的时间戳将完全不能与这些函数一同工作。在这种情况下,解决的办法是将 <CODE>TIMESTAMP/DATE</CODE> 转换为 4 位年份格式或者使用诸如 <CODE>MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)) 的方法</CODE>。
</P>



<H4><A NAME="DATETIME"></A>6.2.2.2  <CODE>DATETIME</CODE>、<CODE>DATE</CODE> 和 <CODE>TIMESTAMP</CODE> 类型</H4>

<P>
<A NAME="IDX1066"></A>
<A NAME="IDX1067"></A>
<A NAME="IDX1068"></A>

</P>
<P>
<CODE>DATETIME</CODE>、<CODE>DATE</CODE> 和 <CODE>TIMESTAMP</CODE> 类型是相似的。这个章节描述了它们的特性以及它们的相似点与不同点。
</P>

<P>
<CODE>DATETIME</CODE> 类型可用于需要同时包含日期和时间信息的值。MySQL 以 <CODE>'YYYY-MM-DD HH:MM:SS'</CODE> 格式检索与显示 <CODE>DATETIME</CODE> 类型。支持的范围是 <CODE>'1000-01-01 00:00:00'</CODE> 到 <CODE>'9999-12-31 23:59:59'</CODE>。(“支持”的含义是,尽管更早的值可能工作,但不能保证他们均可以。)
</P>

<P>
<CODE>DATE</CODE> 类型可用于需要一个日期值而不需要时间部分时。MySQL 以 <CODE>'YYYY-MM-DD'</CODE> 格式检索与显示 <CODE>DATE</CODE> 值。支持的范围是 <CODE>'1000-01-01'</CODE> 到 <CODE>'9999-12-31'</CODE>。

</P>
<P>
<CODE>TIMESTAMP</CODE> 列类型提供了一种类型,通过它你可以以当前操作的日期和时间自动地标记 <CODE>INSERT</CODE> 或<CODE>UPDATE</CODE> 操作。如果一张表中有多个 <CODE>TIMESTAMP</CODE> 列,只有第一个被自动更新。
</P>

<P>
自动更新第一个 <CODE>TIMESTAMP</CODE> 列在下列任何条件下发生:
</P>

<UL>

<LI>
列值没有明确地在一个 <CODE>INSERT</CODE> 或 <CODE>LOAD DATA INFILE</CODE> 语句中被指定。

<LI>
列值没有明确地在一个 <CODE>UPDATE</CODE> 语句中被指定,并且其它的一些列值已发生改变。(注意,当一个 <CODE>UPDATE</CODE> 设置一个列值为它原有值时,这将不会引起 <CODE>TIMESTAMP</CODE> 列的更新,因为,如果你设置一个列值为它当前值时,MySQL 为了效率为忽略更新。)
<LI>

明确地以 <CODE>NULL</CODE> 设置 <CODE>TIMESTAMP</CODE> 列。
</UL>

<P>
第一个列以外其它 <CODE>TIMESTAMP</CODE> 列,可以设置到当前的日期和时间,只要将该列赋值 <CODE>NULL</CODE> 或 <CODE>NOW()</CODE>。
</P>

<P>
任何 <CODE>TIMESTAMP</CODE> 列均可以被设置一个不同于当前操作日期与时间的值,这通过为该列明确指定一个你所期望的值来实现。这也适用于第一个 <CODE>TIMESTAMP</CODE> 列。这个选择性是很有用的,举例来说,当你希望 <CODE>TIMESTAMP</CODE> 列保存该记录行被新添加时的当前的日期和时间,但该值不再发生改变,无论以后是否对该记录行进行过更新:
</P>

<UL>
<LI>
当该记录行被建立时,让 MySQL 设置该列值。这将初始化该列为当前日期和时间。

<LI>
以后当你对该记录行的其它列执行更新时,为 <CODE>TIMESTAMP</CODE> 列值明确地指定为它原来的值。
</UL>

<P>
另一方面,你可能发现更容易的方法,使用 <CODE>DATETIME</CODE> 列,当新建记录行时以 <CODE>NOW()</CODE> 初始化该列,以后在对该记录行进行更新时不再处理它。
</P>

<P>
<tt>示例(译者注):</tt>
<PRE>
mysql&#62; CREATE TABLE `tA` (
    -&#62;   `id` int(3) unsigned NOT NULL auto_increment,
    -&#62;     `date1` timestamp(14) NOT NULL,
    -&#62;     `date2` timestamp(14) NOT NULL,
    -&#62;     PRIMARY KEY  (`id`)
    -&#62; ) TYPE=MyISAM;
Query OK, 0 rows affected (0.01 sec)

mysql&#62; INSERT INTO `tA` SET `id` = 1; 
Query OK, 1 row affected (0.02 sec)

# 没有明确地指定第一个 timestamp 列值,该列值被设为插入的当前时刻
# 没有明确地指定其它的 timestamp 列值,MySQL 则认为插入的是一个非法值,而该列值被设为0

mysql&#62; INSERT INTO `tA` VALUES (2, NOW(), NULL);
Query OK, 1 row affected (0.01 sec)

mysql&#62; SELECT * FROM `tA`;
+----+----------------+----------------+
| id | date1          | date2          |
+----+----------------+----------------+
|  1 | 20030503104118 | 00000000000000 |
|  2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+
2 rows in set (0.00 sec)

mysql&#62; 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&#62; 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&#62; SELECT * FROM `tA`;
+----+----------------+----------------+
| id | date1          | date2          |
+----+----------------+----------------+
|  3 | 20030503104538 | 00000000000000 |
|  2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -