Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45191
  • 博文数量: 43
  • 博客积分: 1161
  • 博客等级: 少尉
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 11:14
文章分类
文章存档

2011年(40)

2010年(3)

分类: Mysql/postgreSQL

2011-05-14 19:09:21

MySQL有两种数值类型,分别是整数(Whole Number,很奇怪为什么书里这么叫,一般我们都叫Integer的吧)和实数(Real Number)。

实数

在实数之下,又细分为TINYINTSMALLINTMEDIUMINTINTBIGINT,分别占用816 24 3264bits。同时,还可以在其后跟一个UNSIGNED修饰符,使之成为无符号整数。

需要注意的是,这些类型的字长不同只是表示数据在硬盘和内存中存储所占用的字长。即使是在32位机器上,MySQL在做整数计算时,也会自动的使用64-bitBIGINT——除了在某些统计类函数中,这些函数为了精度使用了浮点戒双精度浮点型。

MySQL lets you specify a "width" for interger types,such as INT(11).This is meaningless for most applications:it does not restrict the legal range of values,but simply specifies the number of characters MySQL's interactive tools(such as the command-line clint) will reserve for display purposes.

原文意思:MySQL允许用户自定义整数的宽度,如INT(11)。但是对于大多数应用,这样做并没有什么用:这样的定义并不是限定有效数据的宽度,而只是说,在MySQL的交互工具(如命令行控制台)中,用于显示这一列数据的宽度。

原文的后半句,即自定义宽度在交互工具中的作用说的不是特别清楚。

实际的意思是,当指定了INT(11)后,如果在列中存储了不足指定宽度(这里是11)的值,显示的时候会在左侧进行填补显示,当存储了超过指定宽度的值,就按值的实际宽度显示。

上面提到一个“左侧自动填补”,默认情况下是用空格,而在使用了ZEROFILL参数时,左侧会用“0”进行填补。

CREATE TABLE `width` ( 

`num` int(2)default NULL

)ENGINE=MyISAM DEFAULT CHARSET=latin1;

insert into width values(5);

insert into width values(555);

select *from width;

可以看到,“555”的长度大于2,按实际内容显示;“5”的长度小于2,左侧填补空白显示。

CREATE TABLE `width_2` ( 

`num` int(10)unsigned zerofill default NULL

)ENGINE=MyISAM DEFAULT CHARSET=latin1;

insert into width_2 values(23);

select *from width_2;
这里指定了参数zerofill,所以长度不足10的值左侧填补“0”显示。

还有个有趣的现象,在实际建表是,只是加了zerofill参数而没有加unsigned,但最后实际情况却被默认的加上了unsigned,看来这是MySQL的一个自动处理过程,认为“使用了zerofill,就一定是unsigned”——好吧,“0”后面跟个“-”确实不太好看-_-

INT(11)确实作用不大,但是还是有指导意义,从网上获知:当列的实际内容超过指定的宽度时,如果MySQL使用这一列为某些复杂的JOIN生成临时表,可能会出问题——具体什么问题也没说明——因此,尽量设置合适、够用的WIDTH

由上面还可以知道,对于存储和运算,INT(1)INT(11)其实是一样的:因为INT的位宽是32bits,所以存储时总是用32bits;而MySQL做整数运算时总是自动的使用BIGINT,所以计算时总是64bits。 

阅读(260) | 评论(0) | 转发(0) |
0

上一篇:Choosing Optimal Data Types

下一篇:Indexing Basic

给主人留下些什么吧!~~