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

MySQL的列类型(2)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:610 更新时间:2009/4/22 20:43:55
,则输出的Field 和Type 列如下所示(注意,如果用MySQL的3.23 以前的版本运行这个查询,则有一个小故障, 即BIGINT 的显示宽度将是21而不是2 0。):

    每一个数字列都具有一个由列类型所决定的取值范围。如果打算插入一个不在列范围内的值,将会进行截取:MySQL将剪裁该值为取值范围的边界值并使用这个结果。在检索时不进行值的剪裁。
    值的剪裁根据列类型的范围而不是显示宽度进行。例如,一个SMALLINT(3) 列显示宽度为3 而取值范围为-32768 到3 27 6 7。值12345 比显示宽度大,但在该列的取值范围内,因此它可以插入而不用剪裁并且作为12345 检索。值99999 超出了取值范围,因此在插入时被剪裁为3 27 6 7。以后在检索中将以值3 27 6 7检索该值。
    一般赋予浮点列的值被四舍五入到这个列所指定的十进制数。如果在一个FLOAT(8, 1)的列中存储1. 2 3 4 5 6,则结果为1. 2。如果将相同的值存入FLOAT(8, 4) 的列中,则结果为1. 2 3 4 6。这表示应该定义具有足够位数的浮点列以便得到尽可能精确的值。如果想精确到千分之一,那就不要定义使该类型仅有两位小数。
    浮点值的这种处理在MySQL3.23 中有例外,FLOAT(4) 和FLOAT(8) 的性能有所变化。这两种类型现在为单精度( 4 字节)和双精度( 8 字节)的类型,在其值按给出的形式存放(只受硬件的限制)这一点上说,这两种类型是真浮点类型。
    DECIMAL 类型不同于FLOAT和DECIMAL,其中DECIMAL 实际是以串存放的。DECIMAL 可能的最大取值范围与DOUBLE 一样,但是其有效的取值范围由M 和D 的值决定。如果改变M 而固定D,则其取值范围将随M 的变大而变大。表2 - 7的前三行说明了这一点。如果固定M 而改变D,则其取值范围将随D 的变大而变小(但精度增加)。表2 - 7的后三行说明了这一点。

    给定的DECIMAL 类型的取值范围取决于MySQL的版本。对于MySQL3.23 以前的版本,DECIMAL(M, D) 列的每个值占用M 字节,而符号(如果需要)和小数点包括在M 字节中。因此,类型为DECIMAL(5, 2) 的列,其取值范围为-9.99 到9 9 . 9 9,因为它们覆盖了所有可能的5 个字符的值。
    正如MySQL3.23 一样,DECIMAL 值是根据ANSI 规范进行处理的, ANSI 规范规定DECIMAL(M, D) 必须能够表示M 位数字及D 位小数的任何值。例如, DECIMAL(5, 2) 必须能够表示从-999.99 到999.99 的所有值。而且必须存储符号和小数点,因此自MySQL3.23以来DECIMAL 值占M + 2 个字节。对于DECIMAL(5, 2),“最长”的值(- 9 9 9 . 9 9)需要7个字节。在正取值范围的一端,不需要正号,因此MySQL利用它扩充了取值范围,使其超
过了ANSI 所规范所要求的取值范围。如DECIMAL(5, 2) 的最大值为9 9 9 9 . 9 9,因为有7 个字节可用。
    简而言之,在MySQL3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于更早版本中的DECIMAL(M + 2, D) 的取值范围。在MySQL的所有版本中,如果某个DECIMAL 列的D 为0,则不存储小数点。这样做的结果是扩充了列的取值范围,因为过去用来存储小数点的字节现在可用来存放其他数字了。
    1. 数值列的类型属性
    可对所有数值类型指定ZEROFILL 属性。它使相应列的显示值用前导零来填充,以达到显示宽度。在希望确定列值总是以给定的数字位数显示时可利用Z E R O F I L L。实际上,更准确地说是“一个给定的最小数目的数字位数”,因为比显示宽度更宽的值可完全显示而未被剪裁。使用下列语句可看到这一点:

    其中SELECT 语句的输出结果如下。请注意最后一行值,它比列的显示宽度更宽,但仍然完全显示出来:

    如下所示两个属性只用于整数列:
    ■ AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可利用AUTO_ INCREMENT属性。AUTO_INCREMENT 值一般从1开始,每行增加1。在插入NULL 到一个AUTO _INCREMENT 列时,MySQL插入一个比该列中当前最大值大1的值。一个表中最多只能有一个AUTO_INCREMENT 列。对于任何想要使用AUTO_INCREMENT 的列,应该定义为NOT NULL,并定义为PRIMARY KEY 或定义为UNIQUE 键。例如, 可按下列任何一种方式定义AUTO_INCREMENT 列:

    AUTO_INCREMENT 的性能将在下一小节“使用序列”中作进一步的介绍。
    ■ U N S I G N E D。此属性禁用负值。将列定义为UNSIGNED 并不改变其基本数据类型的取值范围;它只是前移了取值的范围。考虑下列的表说明:

    itiny 和itiny_u两列都是T I N Y I N T列,并且都可取2 5 6个值,但是i t i n y的取值范围为-12 8 到127,而itiny_u的取值范围为0 到2 5 5。UNSIGNED 对不取负值的列是非常有用的,如存入人口统计或出席人数的列。如果用常规的有符号列来存储这样的值,那么就只利用了该列类型取值范围的一半。通过使列为U N S I G N E D,能有效地成倍增加其取值范围。如果将列用于序列号,且将它设为U N S I G N E D,则可取原双倍的值。在指定以上属性之后(它们是专门用于数值列的),可以指定通用属性NULL 或N O TNULL。如果未指定NULL 或NOT NULL,则缺省为NULL。也可以用D E FA U LT 属性来指定一个缺省值。如果不指定缺省值,则会自动选择一个。对于所有数值列类型,那些可以包含NULL 的列的缺省将为NULL,不能包含NULL 的列其缺省为0。下面的样例创建三个INT 列,它们分别具有缺省值-1、1和NULL:

    2. 使用序列
    许多应用程序出于标识的目的需要使用唯一的号码。需要唯一值的这种要求在许多场合都会出现,如:会员号、试验样品编号、顾客ID、错误报告或故障标签等等。AUTO_INCREMENT 列可提供唯一编号。这些列可自动生成顺序编号。本节描述AUTO_INCREMENT 列是怎样起作用的,从而使您能够有效地利用它们而不至于出错。另外,还介绍了怎样不用AUTO_INCREMENT 列来产生序列的方法。
    (1) MySQL3.23 以前的版本中的AUTO _ I N C R E M E N TMySQL3.23 版以前的AUTO_INCREMENT 列的性能如下:
    ■ 插入NULL 到AUTO_INCREMENT 列,使MySQL自动地产生下一个序列号并将此序列号自动地插入列中。AUTO_INCREMENT 序列从1开始,因此插入表中的第一个记录得到为1的序列值,而后继插入的记录分别得到序列值2、3 等等。一般,每个自动生成的值都比存储在该列中的当前最大值大1。
    ■ 插入0 到AUTO_INCREMENT 与插入NULL 到列中的效果一样。插入一行而不指定AUTO_INCREMENT 列的值也与插入NULL 的效果一样。
    ■ 如果插入一个记录并明确指定AUTO_INCREMENT 列的一个值,将会发生两件事之一。如果已经存在具有该值的某个记录,则出错,因为AUTO_INCREMENT 列中的值必须是惟一的。如果不存在具有该值的记录,那么新记录将被插入,并且如果新记录的AUTO_INCREMENT 列中的值是新的最大值,那么后续行将用该值的下一个值。换句话说,也就是可以通过插入一个具有比当前值大的序列值的记录,来增大序列的计数器。增大计数器会使序列出现空白,但这个特性也有用。例如创建一个具有AUTO _INCREMENT 列的表,但希望序列从1000 而不是1开始。则可以用后述的两种办法之一达到此目的。一个办法是插入具有明确序列值1000 的第一个记录,然后通过插入NULL 到AUTO_INCREMENT 列来插入后续的记录。另一个办法是插入
AUTO_INCREMENT 列值为999 的假记录。然后第一个实际插入的记录将得到一个序列号10 0 0,这时再将假记录删除。
    ■ 如果将一个不合规定的值插入AUTO_INCREMENT 列,将会出现难以预料的结果。
    ■ 如果删除了在AUTO_INCREMENT 列中含有最大值的记录,则此值在下一次产生新值时会再次使用。如果删除了表中的所有记录,则所有值都可以重用;相应的序列重新从1开始。
    ■ REPLACE 语句正常起作用。
    ■ UPDATE语句按类似插入新记录的规则起作用。如果更新一个AUTO _ I N C R E M E N T列为NULL 或0,则会自动将其更新为下一个序列号。如果试图更新该列为一个已经存在的值,将出错(除非碰巧设置此列的值为它所具有的值,才不会出错,但这没有任何意义)。如果更新该列的值为一个比当前任何列值都大的值,则以后序列将从下一个值继续进行编号。
    ■ 最近自动产生的序列编号值可调用L A S T _ INSERT_ID( ) 函数得到。它使得能在其他不知道此值的语句中引用AUTO_INCREMENT 值。L A S T _ INSERT_ID( ) 依赖于当前服务器会话中生成的AUTO_INCREME


没有相关教程
教程录入: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……
    咸宁网络警察报警平台