?? manual_reference.html
字號:
6 個字符的字符串。例如,如果你指定<code>'9903'</code>,認為將代表1999年3月,你會發現<strong>MySQL</strong>把一個“零”日期插入到你的表中,這是因為年份和月份值<code>99</code>和<code>03</code>,但是日期部分丟失(零),因此該值不是一個合法的日期。
</p>
<p><code>TIMESTAMP</code>列使用被指定的值的完整精度的存儲合法的值,不考慮顯示大小。這有幾個含意:
<ul>
<li>總是指定年,月,和日,即使你的列類型是<code>TIMESTAMP(4)</code>或<code>TIMESTAMP(2)</code>。否則,值將不是一個合法的日期并且<code>0</code>將被存儲。
</li>
<li>如果你使用<code>ALTER TABLE</code>拓寬一個狹窄的<code>TIMESTAMP</code>列,以前被“隱蔽”的信息將被顯示。
</li>
<li>同樣,縮小一個<code>TIMESTAMP</code>列不會導致信息失去,除了感覺上值在顯示時,較少的信息被顯示出。
</li>
<li>盡管<code>TIMESTAMP</code>值被存儲為完整精度,直接操作存儲值的唯一函數是<code>UNIX_TIMESTAMP()</code>,其他函數操作在格式化了的檢索的值上,這意味著你不能使用函數例如<code>HOUR()</code>或<code>SECOND()</code>,除非<code>TIMESTAMP</code>值的相關部分被包含在格式化的值中。例如,一個<code>TIMESTAMP</code>列的<code>HH</code>部分部被顯示,除非顯示大小至少是10,因此在更短的<code>TIMESTAMP</code>值上試試使用<code>HOUR()</code>產生一個無意義的結果。
</li>
</ul>
<p>在某種程度上,你可以把一種日期類型的值賦給一個不同的日期類型的對象。然而,這可能值有一些改變或信息的損失:
<ul>
<li>如果你將一個<code>DATE</code>值賦給一個<code>DATETIME</code>或<code>TIMESTAMP</code>對象,結果值的時間部分被設置為<code>'00:00:00'</code>,因為<code>DATE</code>值不包含時間信息。
</li>
<li>如果你將一個<code>DATETIME</code>或<code>TIMESTAMP</code>值賦給一個<code>DATE</code>對象,結果值的時間部分被刪除,因為<code>DATE</code>類型不存儲時間信息。
</li>
<li>記住,盡管<code>DATETIME</code>, <code>DATE</code>和<code>TIMESTAMP</code>值全都可以用同樣的格式集來指定,但所有類型不都有同樣的值范圍。例如,<code>TIMESTAMP</code>值不能比<code>1970</code>早或比<code>2037</code>網晚,這意味著,一個日期例如<code>'1968-01-01'</code>,當作為一個<code>DATETIME</code>或<code>DATE</code>值合法時,它不是一個正確<code>TIMESTAMP</code>值,并且如果賦值給這樣一個對象,它將被變換到<code>0</code>。
</li>
</ul>
<p>當指定日期值時,當心某些缺陷:
<ul>
<li>允許作為字符串指定值的寬松格式能被欺騙。例如,值例如<code>'10:11:12'</code>可能看起來像時間值,因為<samp>“:”</samp>分隔符,但是如果在一個日期中使用,上下文將作為年份被解釋成<code>'2010-11-12'</code>。值<code>'10:45:15'</code>將被變換到<code>'0000-00-00'</code>,因為<code>'45'</code>不是一個合法的月份。
</li>
<li>以2位數字指定的年值是模糊的,因為世紀是未知的。<strong>MySQL</strong>使用下列規則解釋2位年值:
<ul>
<li>在<code>00-69</code>范圍的年值被變換到<code>2000-2069</code>。 </li>
<li>在范<code>70-99</code>圍的年值被變換到<code>1970-1999</code>。 </li>
</ul>
</li>
</ul>
<h4><a NAME="TIME" HREF="manual_toc.html#TIME">7.3.6.3 <code>TIME</code>類型</a></h4>
<p><strong>MySQL</strong>檢索并以<code>'HH:MM:SS'</code>格式顯示<code>TIME</code>值(或對大小時值,<code>'HHH:MM:SS'</code>格式)。<code>TIME</code>值的范圍可以從<code>'-838:59:59'</code>到<code>'838:59:59'</code>。小時部分可能很大的的原因是<code>TIME</code>類型不僅可以被使用在表示一天的時間(它必須是不到24個小時),而且用在表示在2個事件之間經過的時間或時間間隔(它可以是比24個小時大些,或甚至是負值)。
</p>
<p>你能用多中格式指定<code>TIME</code>值:
<ul>
<li>作為<code>'HH:MM:SS'</code>格式的一個字符串。“寬松”的語法被允許--任何標點符號可用作時間部分的分隔符,例如,<code>'10:11:12'</code>和<code>'10.11.12'</code>是等價的。
</li>
<li>作為沒有分隔符的<code>'HHMMSS'</code>格式的一個字符串,如果它作為一個時間解釋。例如,<code>'101112'</code>被理解為<code>'10:11:12'</code>,但是<code>'109712'</code>是不合法的(它有無意義的分鐘部分)并變成<code>'00:00:00'</code>。
</li>
<li>作為<code>HHMMSS</code>格式的一個數字,如果它能解釋為一個時間。例如,<code>101112</code>被理解為<code>'10:11:12'</code>。
</li>
<li>返回值可在一個<code>TIME</code>上下文接受的函數,例如<code>CURRENT_TIME</code>。
</li>
</ul>
<p>對于作為包括一個時間分隔符的字符串被指定的<code>TIME</code>值,不必為小于<code>10</code>的小時、分鐘或秒值指定2位數字,<code>'8:3:2'</code>與<code>'08:03:02'</code>是一樣的。
</p>
<p>將“短的”<code>TIME</code>值賦值給一個<code>TIME</code>行列是要格外小心。<strong>MySQL</strong>使用最右位代表秒的假設來解釋值。(<strong>MySQL</strong>將<code>TIME</code>值解釋為經過的時間,而非作為一天的時間
)例如,你可能想到<code>'11:12'</code>、<code>'1112'</code>和<code>1112</code>意味著<code>'11:12:00'</code>(11點12分),但是<strong>MySQL</strong>解釋他們為<code>'00:11:12'</code>(11分12秒)。同樣,<code>'12'</code>和<code>12</code>被解釋為<code>'00:00:12'</code>。
</p>
<p>但是超出<code>TIME</code>范圍之外的值是樣合法的,它被剪切到范圍適當的端點值。例如,<code>'-850:00:00'</code>和<code>'850:00:00'</code>被變換到<code>'-838:59:59'</code>和<code>'838:59:59'</code>。
</p>
<p>不合法的<code>TIME</code>值被變換到<code>'00:00:00'</code>。注意,既然<code>'00:00:00'</code>本身是一個合法的<code>TIME</code>值,沒有其他方法區分表中存儲的一個<code>'00:00:00'</code>值,原來的值是否被指定為<code>'00:00:00'</code>或它是否是不合法的。
</p>
<h4><a NAME="YEAR" HREF="manual_toc.html#YEAR">7.3.6.4 <code>YEAR</code>類型</a></h4>
<p><code>YEAR</code>類型是一個 1 字節類型用于表示年份。 </p>
<p><strong>MySQL</strong>檢索并且以<code>YYYY</code>格式顯示<code>YEAR</code>值,其范圍是<code>1901</code>到<code>2155</code>。
</p>
<p>你能用多種格式指定<code>YEAR</code>值:
<ul>
<li>作為在<code>'1901'</code>到<code>'2155'</code>范圍的一個4位字符串。 </li>
<li>作為在<code>1901</code>到<code>2155</code>范圍的一個4位數字。 </li>
<li>作為在<code>'00'</code>到<code>'99'</code>范圍的一個2位字符串.在<code>'00'</code>到<code>'69'</code>和<code>'70'</code>到<code>'99'</code>范圍的值被變換到在<code>2000</code>到<code>2069</code>范圍和<code>1970</code>到<code>1999</code>的<code>YEAR</code>值。</li>
<li>作為在<code>1</code>到<code>99</code>范圍的一個2位數字。在范圍<code>1</code>到<code>69</code>和<code>70</code>到<code>99</code>的值被變換到在范圍<code>2001</code>到<code>2069</code>和<code>1970</code>到<code>1999</code>的<code>YEAR</code>的值。注意對于2位數字的范圍略微不同于2位數字字符串的范圍,因為你不能直接指定零作為一個數字并且把它解釋為<code>2000</code>。你<em>必須</em>作為一個字符串<code>'0'</code>或<code>'00'</code>指定它,它將被解釋為<code>0000</code>。
</li>
<li>其返回值可在一個<code>YEAR</code>上下文環境中接受的函數,例如<code>NOW()</code>。
</li>
</ul>
<p>不合法<code>YEAR</code>值被變換到<code>0000</code>。 </p>
<h3><a NAME="String_types" HREF="manual_toc.html#String_types">7.3.7 字符串類型</a></h3>
<p>字符串類型是<code>CHAR</code>、<code>VARCHAR</code>、<code>BLOB</code>、<code>TEXT</code>、<code>ENUM</code>和<code>SET</code>。
</p>
<h4><a NAME="CHAR" HREF="manual_toc.html#CHAR">7.3.7.1 <code>CHAR</code>和<code>VARCHAR</code>類型</a></h4>
<p><code>CHAR</code>和<code>VARCHAR</code>類型是類似的,但是在他們被存儲和檢索的方式不同。
</p>
<p>一個<code>CHAR</code>列的長度被修正為在你創造表時你所聲明的長度。長度可以是1和255之間的任何值。(在MySQL
3.23中,<code>CHAR</code>長度可以是0~255。) 當<code>CHAR</code>值被存儲時,他們被用空格在右邊填補到指定的長度。當<code>CHAR</code>值被檢索時,拖后的空格被刪去。
</p>
<p>在<code>VARCHAR</code>列中的值是變長字符串。你可以聲明一個<code>VARCHAR</code>列是在1和255之間的任何長度,就像對<code>CHAR</code>列。然而,與<code>CHAR</code>相反,<code>VARCHAR</code>值只存儲所需的字符,外加一個字節記錄長度,值不被填補;相反,當值被存儲時,拖后的空格被刪去。(這個空格刪除不同于ANSI
SQL規范。)</p>
<p>如果你把一個超過列最大長度的值賦給一個<code>CHAR</code>或<code>VARCHAR</code>列,值被截斷以適合它。
</p>
<p>下表顯示了兩種類型的列的不同,通過演示存儲變長字符串值到<code>CHAR(4)</code>和<code>VARCHAR(4)</code>列:
</p>
<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
<tr>
<td><strong>值</strong> </td>
<td><code>CHAR(4)</code> </td>
<td><strong>存儲需求</strong> </td>
<td><code>VARCHAR(4)</code> </td>
<td><strong>存儲需求</strong> </td>
</tr>
<tr>
<td><code>''</code> </td>
<td><code>' '</code> </td>
<td>4 個字節</td>
<td><code>''</code> </td>
<td>1 字節</td>
</tr>
<tr>
<td><code>'ab'</code> </td>
<td><code>'ab '</code> </td>
<td>4 個字節</td>
<td><code>'ab'</code> </td>
<td>3 個字節</td>
</tr>
<tr>
<td><code>'abcd'</code> </td>
<td><code>'abcd'</code> </td>
<td>4 個字節</td>
<td><code>'abcd'</code> </td>
<td>5 個字節</td>
</tr>
<tr>
<td><code>'abcdefgh'</code> </td>
<td><code>'abcd'</code> </td>
<td>4 個字節</td>
<td><code>'abcd'</code> </td>
<td>5 個字節</td>
</tr>
</table>
<p>從<code>CHAR(4)</code>和<code>VARCHAR(4)</code>列檢索的值在每種情況下都是一樣的,因為拖后的空格從檢索的<code>CHAR</code>列上被刪除。
</p>
<p>在<code>CHAR</code>和<code>VARCHAR</code>列中存儲和比較值是以大小寫不區分的方式進行的,除非當桌子被創建時,<code>BINARY</code>屬性被指定。<code>BINARY</code>屬性意味著該列的值根據<strong>MySQL</strong>服務器正在運行的機器的ASCII順序以大小寫區分的方式存儲和比較。
</p>
<p><code>BINARY</code>屬性是“粘性”的。這意味著,如果標記了<code>BINARY</code>的列用于一個表達式中,整個的表達式作為一個<code>BINARY</code>值被比較。
</p>
<p><strong>MySQL</strong>在表創建時可以隱含地改變一個<code>CHAR</code>或<code>VARCHAR</code>列的類型。見<a HREF="manual_Reference.html#Silent_column_changes">7.7.1 隱含的的列說明改變</a>。
</p>
<h4><a NAME="BLOB" HREF="manual_toc.html#BLOB">7.3.7.2 <code>BLOB</code>和<code>TEXT</code>類型</a></h4>
<p>一個<code>BLOB</code>是一個能保存可變數量的數據的二進制的大對象。4個<code>BLOB</code>類型<code>TINYBLOB</code>、<code>BLOB</code>、<code>MEDIUMBLOB</code>和<code>LONGBLOB</code>僅僅在他們能保存值的最大長度方面有所不同。見<a HREF="manual_Reference.html#Storage_requirements">7.3.1 列類型存儲需求</a>。 </p>
<p>4個<code>TEXT</code>類型<code>TINYTEXT</code>、<code>TEXT</code>、<code>MEDIUMTEXT</code>和<code>LONGTEXT</code>對應于4個<code>BLOB</code>類型,并且有同樣的最大長度和存儲需求。在<code>BLOB</code>和<code>TEXT</code>類型之間的唯一差別是對<code>BLOB</code>值的排序和比較以大小寫敏感方式執行,而對<code>TEXT</code>值是大小寫不敏感的。換句話說,一個<code>TEXT</code>是一個大小寫不敏感的<code>BLOB</code>。
</p>
<p>如果你把一個超過列類型最大長度的值賦給一個<code>BLOB</code>或<code>TEXT</code>列,值被截斷以適合它。
</p>
<p>在大多數方面,你可以認為一個<code>TEXT</code>行列是你所希望大的一個<code>VARCHAR</code>列。同樣,你可以認為一個<code>BLOB</code>列是一個<code>VARCHAR
BINARY</code>列。差別是:
<ul>
<li>用<strong>MySQL</strong>版本3.23.2和更新,你能在<code>BLOB</code>和<code>TEXT</code>列上索引。更舊的<strong>MySQL</strong>版本不支持這個。
</li>
<li>當值被存儲時,對<code>BLOB</code>和<code>TEXT</code>列沒有拖后空格的刪除,因為對<code>VARCHAR</code>列有刪除。
</li>
<li><a NAME="IDX251"></a><code>BLOB</code>和<code>TEXT</code>列不能有<code>DEFAULT</code>值。
</li>
</ul>
<p><strong>MyODBC</strong>定義<code>BLOB</code>為<code>LONGVARBINARY</code>,<code>TEXT</code>值為<code>LONGVARCHAR</code>。
</p>
<p>因為<code>BLOB</code>和<code>TEXT</code>值可以是非常長的,當使用他們時,你可能遇到一些限制:
<ul>
<li>如果你想要在一個<code>BLOB</code>或<code>TEXT</code>列上使用<code>GROUP BY</code>或<code>ORDER
BY</code>,你必須將列值變換成一個定長對象。這樣做的標準方法是用<code>SUBSTRING</code>函數。例如:
<pre>mysql> select commen
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -