转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
MySQL 4.1.0 中文参考手册 --- 6.2 列类型         ★★★★

MySQL 4.1.0 中文参考手册 --- 6.2 列类型

作者:闵涛 文章来源:闵涛的学习笔记 点击数:3718 更新时间:2009/4/22 20:56:55
示例结束(译者注):

  • 同样的,缩小一个 TIMESTAMP 列的宽度不会引起信息的丢失,除了在感觉上值在被显示时显示了较少的信息。
  • 尽管 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 值赋给一个 DATETIMETIMESTAMP 对象,结果值的时间部分将被设为 ''''00:00:00'''',因为 DATE 值不包含时间信息。
    • 如果将一个 DATETIMETIMESTAMP 值赋给一个 DATE 对象,结果值的时间部分被删除,因为 DATE 类型不能存储时间信息。
    • 记住,尽管 DATETIMEDATETIMESTAMP 值全都可以用同样的格式集来指定,但所有类型不都有同有同样的值范围。例如,TIMESTAMP 值不能早于 1970 或晚于 2037。这就意味着,一个日期例如 ''''1968-01-01'''',作为一个 DATETIMEDATE 值是合法的,但不是一个有效的 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.fractionHH:MM:SSHH:MMD HH:MM:SSD HH:MMD HHSS。这里的 D 是一个在 0-33 之间的日期。
    • 一个无定界符的 ''''HHMMSS'''' 格式的字符串,只要字符串看起来像是一个时间。例如:''''101112'''' 可被理解为 ''''10:11:12'''',但是 ''''109712'''' 是不合法的(它有一个无意义的分钟部分),当被插入时会转换为 ''''00:00:00''''
    • 一个 HHMMSS 格式的数字,只要数字看起来像一个时间。例如,101112 可被理解为 ''''10:11:12''''。下面的任一格式均可被正常理解:SSMMSSHHMMSSHHMMSS.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 值。范围是 19012155

    可以以多个格式指定 YEAR 值:

    • 一个在 ''''1901''''''''2155'''' 范围之内的 4 位字符串。
    • 一个在 19012155 范围之内的 4 位数字。
    • 一个在 ''''00''''''''99'''' 范围之内的 2 位字符串。''''00''''''''69''''''''70''''''''99'''' 范围内的值将被分别转换到 2000206919701999 范围内的 YEAR 值。
    • 一个在 199 范围之内的数字。1697099 范围内的值将被分别转换到 2001206919701999 范围内的 YEAR 值。注意,两位数字的范围与两位字符串的范围稍稍有点不同,因为你不能直接地以数字指定一个零值,将它解释为 2000。你必须 以一个 ''''0''''''''00'''' 格式的字符串指定它,否则它将被解释为 0000
    • 在一个 YEAR 的语境中,函数(例如 NOW())的返回值将会返回一个合理的格式。

    不合法的 YEAR 值将被转换为 0000

    6.2.3 字符串类型

    字符串类型有 CHARVARCHARBLOBTEXTENUMSET。这个章节描述这些类型是如何工作的,它们的存储需求,以及在你的查询中如何使用它们。

    类型 最大尺寸 字节 TINYTEXTTINYBLOB 2^8-1 255 TEXTBLOB 2^16-1 (64K-1) 65535 MEDIUMTEXTMEDIUMBLOB 2^24-1 (16M-1) 16777215 LONGBLOB 2^32-1 (4G-1) 4294967295

    6.2.3.1 CHARVARCHAR 类型

    CHARVARCHAR 类型是很相似的,但是它们被存储与检索的方式有些不同。

    一个 CHAR 列的长度被固定为你创建表进所声明的长度。长度可以是 1 和 255 之间的任一值。(从 MySQL 3.23 之后,CHAR 的长度可以是 0 到 255。)当 CHAR 值被存储时,他们被用空格在右边填补到指定长度。当 CHAR 值被检索时,尾部的空格被截除。

    VARCHAR 列的值是变长的字符串。你可以声明一个 VARCHAR 列在 1 到 255, 就像对 CHAR 列一样。然而,与 CHAR 相反的,VARCHAR 值只以所需的字符数存储,另加一个字节存储记录的长度。值并不被填补;相反的,当被存储时,尾部的空格被截除。(这个截除空格方式不同于 ANSI SQL 规约。)

    如果将一个超过列最大长度的值赋给一个 CHARVARCHAR 列,该值将截断以适合它。

    下表通过在 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 列上检索值的尾部空格会被截除。

    CHARVARCHAR 列值以省略字母大小写的方式进行排序和比较,除非在表建立时 BINARY 属性被指定。BINARY 属性意味着,该列值根据 MySQL 服务器正在运行的机器的 ASCII 表顺序进行字母大小写敏感的方式排序和比较。BINARY 并不影响该列如何被存储和检索。

    BINARY 属性是有粘性的。这就意味着,如果一个被标记为 BINARY 的列被用于一个表达式中,整个表达式将作为一个 BINARY 值被比较。

    在表创建时,MySQL 可能会隐式地改变一个 CHARVARCHAR 列的类型。查看章节 6.5.3.1 隐式的列定义变化。

    6.2.3.2 BLOBTEXT 类型

    一个 BLOB 是一个可以保存一可变数量的数据的二进制大对象。四个 BLOB 类型(TINYBLOBBLOBMEDIUMBLOBLONGBLOB)之间的不同仅仅在于他们能保存值的最大长度不一致。查看章节 6.2.6 列类型存储需求。

    四个 TEXT 类型(TINYTEXTTEXTMEDIUMTEXTLONGTEXT)对应与四个 BLOB 类型,并且有相同的最大长度和存储需求。在 BLOBTEXT 类型之间的唯一差别就是,对 BLOB 值是以字母大小写敏感的方式进行排序和比较的,而对 TEXT 值以忽略字母大小写方式进行排序和比较。换句话说,TEXT 是一个忽略字母大小写的 BLOB

    如果将一个超过列类型最大长度的值赋给一个 BLOBTEXT 列,该值将被截断以适应它。

    在大多数方面,可以将一个 TEXT 列看作是一个你所希望大 VARCHAR 列。同样的,BLOB 列可以看作是一个 VARCHAR BINARY 列。差别就在于:

    • 在 MySQL 3.23.2 和更新的版本中,可以在 BLOBTEXT 列上建立索引。而较老版本的 MySQL 是不支持的。
    • BLOB and TEXT 列值被存储时,尾部的空格不会被剪切,这与 VARCHAR 列是不一样的。
    • BLOBTEXT 列不可以有 DEFAULT 值。

    MyODBCLONGVARBINARY 定义 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数据库
  • 教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台