?? manual_reference.html
字號:
</p>
<p><code>REAL</code>和<code>DOUBLE PRECISION</code>類型不接受精度說明。作為對
ANSI/ISO SQL92 標準的擴展,<strong>MySQL</strong>識別出<code>DOUBLE</code>作為<code>DOUBLE
PRECISION</code>類型的一個同義詞。與<code>REAL</code>精度比用于<code>DOUBLE
PRECISION</code>的更小的標準要求相反,<strong>MySQL</strong>實現了兩種,作為8字節雙精度浮點值(當運行不是“Ansi模式”時)。為了最大的移植性,近似數字的數據值的存儲所需代碼應該使用沒有精度或小數位數說明的<code>FLOAT</code>或<code>DOUBLE
PRECISION</code>。 </p>
<p>當要求在數字的列存儲超出該列類型允許的范圍的值時,<strong>MySQL</strong>剪切該值到范圍內的正確端點值并且存儲剪切后的結果值。
</p>
<p>例如,一個<code>INT</code>列的范圍是<code>-2147483648</code>到<code>2147483647</code>。如果你試圖插入<code>-9999999999</code>到一個<code>INT</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>語句,由于剪切所發生的變換作為“警告”被報告。
</p>
<h3><a NAME="Date_and_time_types" HREF="manual_toc.html#Date_and_time_types">7.3.6
日期和時間類型</a></h3>
<p>日期和時間類型是<code>DATETIME</code>、<code>DATE</code>、<code>TIMESTAMP</code>、<code>TIME</code>和<code>YEAR</code>。這些的每一個都有合法值的一個范圍,而“零”當你指定確實不合法的值時被使用。注意,MySQL允許你存儲某個“不嚴格地”合法的日期值,例如<code>1999-11-31</code>,原因我們認為它是應用程序的責任來處理日期檢查,而不是SQL服務器。為了使日期檢查更“快”,<strong>MySQL</strong>僅檢查月份在0-12的范圍,天在0-31的范圍。上述范圍這樣被定義是因為<strong>MySQL</strong>允許你在一個<code>DATE</code>或<code>DATETIME</code>列中存儲日期,這里的天或月是零。這對存儲你不知道準確的日期的一個生日的應用程序來說是極其有用的,在這種情況下,你簡單地存儲日期象<code>1999-00-00</code>或<code>1999-01-00</code>。(當然你不能期望從函數如<code>DATE_SUB()</code>或<code>DATE_ADD()</code>得到類似以這些日期的正確值)。
</p>
<p>當用日期和時間工作時,這里是的一些要記住的一般考慮:
<ul>
<li><strong>MySQL</strong>對一個給定的日期或時間類型以標準的格式檢索,但是它試圖為你提供的值解釋成許多格式(例如,當你指定一個值被賦給或與比較一個日期或時間類型時),但是只支持有在下列小節描述的格式。期望你提供合法的值,并且如果你以其他格式使用這些值,可能造成無法預料的結果。
</li>
<li>盡管<strong>MySQL</strong>試圖以多種格式解釋值,但它總是期望日期值的年份部分在最左面,日期必須以年-月-日的順序給出(例如,<code>'98-09-04'</code>),而不是以其他地方常用的月-日-年或日-月-年的次序(例如,<code>'09-04-98'</code>、'04-09-98')。
</li>
<li>如果一個值在數字的上下文環境中被使用,<strong>MySQL</strong>自動變換一個日期或時間類型值到一個數字,反過來也如此。
</li>
<li>當<strong>MySQL</strong>遇到一個日期或時間類型的值超出范圍或對給類型不合法(見本節的開始)時,它將該類型的值變換到“零”值。(例外的是超出范圍的<code>TIME</code>值被剪切為適當的<code>TIME</code>范圍端點值。)下表顯示對每種類型的“零”值的格式:
<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
<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>
<li>“零”值是特殊的,但是你能使用在表中顯示的值來明顯地存儲或引用他們。你也可以使用值<code>'0'</code>或<code>0</code>做到,
這更容易寫。 </li>
<li>在<strong>MyODBC</strong> 2.50.12和以上版本中,由<strong>MyODBC</strong>使用的“零”日期或時間值被自動變換到<code>NULL</code>,因為ODBC不能處理這樣的值。
</li>
</ul>
<h4><a NAME="Y2K_issues" HREF="manual_toc.html#Y2K_issues">7.3.6.1 Y2K問題和日期類型</a></h4>
<p><strong>MySQL</strong>本身Y2K安全的(見<a HREF="manual_Introduction.html#Year_2000_compliance">1.6 2000年一致性</a>),但是呈交給<strong>MySQL</strong>的輸入值可能不是。一個包含2位年份值的任何輸入是由二義性的,因為世紀是未知的。這樣的值必須被解釋成4位形式,因為<strong>MySQL</strong>內部使用4位存儲年份。
</p>
<p>對于<code>DATETIME</code>, <code>DATE</code>, <code>TIMESTAMP</code>和<code>YEAR</code>類型,<strong>MySQL</strong>使用下列規則的解釋二義性的年份值:
<ul>
<li>在范圍<code>00-69</code>的年值被變換到<code>2000-2069</code>。 </li>
<li>在范圍<code>70-99</code>的年值被變換到<code>1970-1999</code>。</li>
</ul>
<p>記得這些規則僅僅提供對于你數據的含義的合理猜測。如果<strong>MySQL</strong>使用的啟發規則不產生正確的值,你應該提供無二義的包含4位年值的輸入。
</p>
<h4><a NAME="DATETIME" HREF="manual_toc.html#DATETIME">7.3.6.2 <code>DATETIME</code>, <code>DATE</code>和<code>TIMESTAMP</code>類型</a></h4>
<p><code>DATETIME</code>, <code>DATE</code>和<code>TIMESTAMP</code>類型是相關的。本節描述他們的特征,他們是如何類似的而又不同的。
</p>
<p><code>DATETIME</code>類型用在你需要同時包含日期和時間信息的值時。<strong>MySQL</strong>檢索并且以<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>類型用在你僅需要日期值時,沒有時間部分。<strong>MySQL</strong>檢索并且以<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>列在下列任何條件下發生:
<ul>
<li>列沒有明確地在一個<code>INSERT</code>或<code>LOAD DATA INFILE</code>語句中指定。
</li>
<li>列沒有明確地在一個<code>UPDATE</code>語句中指定且一些另外的列改變值。(注意一個<code>UPDATE</code>設置一個列為它已經有的值,這將不引起<code>TIMESTAMP</code>列被更新,因為如果你設置一個列為它當前的值,<strong>MySQL</strong>為了效率而忽略更改。)</li>
<li>你明確地設定<code>TIMESTAMP</code>列為<code>NULL</code>. </li>
</ul>
<p>除第一個以外的<code>TIMESTAMP</code>列也可以設置到當前的日期和時間,只要將列設為<code>NULL</code>,或<code>NOW()</code>。
</p>
<p>通過明確地設置希望的值,你可以設置任何<code>TIMESTAMP</code>列為不同于當前日期和時間的值,即使對第一個<code>TIMESTAMP</code>列也是這樣。例如,如果,當你創建一個行時,你想要一個<code>TIMESTAMP</code>被設置到當前的日期和時間,但在以后無論何時行被更新時都不改變,你可以使用這個屬性:
<ul>
<li>讓<strong>MySQL</strong>在行被創建時設置列,這將初始化它為當前的日期和時間。
</li>
<li>當你執行隨后的對該行中其他列的更改時,明確設定<code>TIMESTAMP</code>列為它的當前值。
</li>
</ul>
<p>另一方面,你可能發現,當行被創建并且遠離隨后的更改時,很容易用一個你用<code>NOW()</code>初始化的<code>DATETIME</code>列。
</p>
<p><code>TIMESTAMP</code>值可以從1970的某時的開始一直到2037年,精度為一秒,其值作為數字顯示。
</p>
<p>在<strong>MySQL</strong>檢索并且顯示<code>TIMESTAMP</code>值取決于顯示尺寸的格式如下表。“完整”<code>TIMESTAMP</code>格式是14位,但是<code>TIMESTAMP</code>列可以用更短的顯示尺寸創造:
</p>
<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
<tr>
<td><strong>列類型</strong> </td>
<td><strong>顯示格式</strong> </td>
</tr>
<tr>
<td><code>TIMESTAMP(14)</code> </td>
<td><code>YYYYMMDDHHMMSS</code> </td>
</tr>
<tr>
<td><code>TIMESTAMP(12)</code> </td>
<td><code>YYMMDDHHMMSS</code> </td>
</tr>
<tr>
<td><code>TIMESTAMP(10)</code> </td>
<td><code>YYMMDDHHMM</code> </td>
</tr>
<tr>
<td><code>TIMESTAMP(8)</code> </td>
<td><code>YYYYMMDD</code> </td>
</tr>
<tr>
<td><code>TIMESTAMP(6)</code> </td>
<td><code>YYMMDD</code> </td>
</tr>
<tr>
<td><code>TIMESTAMP(4)</code> </td>
<td><code>YYMM</code> </td>
</tr>
<tr>
<td><code>TIMESTAMP(2)</code> </td>
<td><code>YY</code> </td>
</tr>
</table>
<p>所有的<code>TIMESTAMP</code>列都有同樣的存儲大小,不考慮顯示尺寸。最常見的顯示尺寸是6、8、12、和14。你可以在表創建時間指定一個任意的顯示尺寸,但是值0或比14大被強制到14。在從1~13范圍的奇數值尺寸被強制為下一個更大的偶數。
</p>
<p>使用一個常用的格式集的任何一個,你可以指定<code>DATETIME</code>、<code>DATE</code>和<code>TIMESTAMP</code>值:
<ul>
<li><code>'YYYY-MM-DD HH:MM:SS'</code>或<code>'YY-MM-DD HH:MM:SS'</code>格式的一個字符串。允許一種“寬松”的語法--任何標點可用作在日期部分和時間部分之間的分隔符。例如,<code>'98-12-31
11:30:45'</code>、<code>'98.12.31 11+30+45'</code>、<code>'98/12/31 11*30*45'</code>和<code>'98@12@31
11^30^45'</code>是等價的。 </li>
<li><code>'YYYY-MM-DD'</code>或<code>'YY-MM-DD'</code>格式的一個字符串。允許一種“寬松”的語法。例如,<code>'98-12-31'</code>,
<code>'98.12.31'</code>, <code>'98/12/31'</code>和<code>'98@12@31'</code>是等價的。 </li>
<li><code>'YYYYMMDDHHMMSS'</code>或<code>'YYMMDDHHMMSS'</code>格式的沒有任何分隔符的一個字符串,例如,<code>'19970523091528'</code>和<code>'970523091528'</code>被解釋為<code>'1997-05-23
09:15:28'</code>,但是<code>'971122459015'</code>是不合法的(它有毫無意義的分鐘部分)且變成<code>'0000-00-00
00:00:00'</code>。 </li>
<li><code>'YYYYMMDD'</code>或<code>'YYMMDD'</code>格式的沒有任何分隔符的一個字符串,如果字符串認為是一個日期。例如,<code>'19970523'</code>和<code>'970523'</code>被解釋作為<code>'1997-05-23'</code>,但是<code>'971332'</code>是不合法的(
它有無意義的月和天部分)且變成<code>'0000-00-00'</code>。 </li>
<li><code>YYYYMMDDHHMMSS</code>或<code>YYMMDDHHMMSS</code>格式的一個數字,如果數字認為是一個日期。例如,<code>19830905132800</code>和<code>830905132800</code>被解釋作為<code>'1983-09-05
13:28:00'</code>。 </li>
<li><code>YYYYMMDD</code>或<code>YYMMDD</code>格式的一個數字,如果數字認為是一個日期。例如,<code>19830905</code>和<code>830905</code>被解釋作為<code>'1983-09-05'</code>。
</li>
<li>一個返回值可以在一個<code>DATETIME</code>, <code>DATE</code>或<code>TIMESTAMP</code>上下文環境中接受的函數,例如<code>NOW()</code>或<code>CURRENT_DATE</code>。
</li>
</ul>
<p>不合法<code>DATETIME</code>, <code>DATE</code>或<code>TIMESTAMP</code>值被變換到適當類型的“零”值(<code>'0000-00-00
00:00:00'</code>, <code>'0000-00-00'</code>或<code>00000000000000</code>)。 </p>
<p>對于包括的日期部分分隔符的指定為字符串的值,不必要為小于<code>10</code>的月或天的值指定2位數字,<code>'1979-6-9'</code>與<code>'1979-06-09'</code>是一樣的。同樣,
對于包括的時間部分分隔符的指定為字符串的值,不必為小于<code>10</code>的小時、月或秒指定2位數字,<code>'1979-10-30
1:2:3'</code>與<code>'1979-10-30 01:02:03'</code>是一樣的。 </p>
<p>指定為數字應該是6、8、12或14位長。如果數字是8或14位長,它被假定以<code>YYYYMMDD</code>或<code>YYYYMMDDHHMMSS</code>格式并且年份由頭4位數字給出。如果數字是6或12位長,它被假定是以<code>YYMMDD</code>或<code>YYMMDDHHMMSS</code>格式且年份由頭2位數字給出。不是這些長度之一的數字通過填補前頭的零到最接近的長度來解釋。
</p>
<p>指定為無分隔符的字符串用它們給定的長度來解釋。如果字符串長度是8或14個字符,年份被假定頭4個字符給出,否則年份被假定由頭2個字符給出。對于字符串中呈現的多個部分,字符串從左到右邊被解釋,以找出年、月、日、小時、分鐘和秒值,這意味著,你不應該使用少于
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -