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

📄 manual_reference.html

📁 MySQL参考手册中文版
💻 HTML
📖 第 1 页 / 共 5 页
字号:
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&gt; select commen

⌨️ 快捷键说明

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