mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么

详解mysql int类型的长度值

  mysql在建表的时候int类型后的长度代表什么 是该列允许存储值的最大宽度吗 为什么我设置成int(1), 也一样能存10,100,1000呢.

  当时我虽然知道int(1),这个长度1并不代表允许存储的宽度,但却没有一个合理的解释. 或者说对这个长度也没有真正的研究过到底代表什么, 平时都用int(11), 也不知道为什么要11位. 所以我在网上查阅了一些资料, 也仔细的看了mysql手册关于int data type的说法.

  以下是每个整数类型的存储和范围(来自mysql手册)


  类型


  字节


  最小值


  最大值


  (带符号的/无符号的)


  (带符号的/无符号的)


  TINYINT


  1


  -128


  127


  0


  255


  SMALLINT


  2


  -32768


  32767


  0


  65535


  MEDIUMINT


  3


  -8388608


  8388607


  0


  16777215


  INT


  4


  -2147483648


  2147483647


  0


  4294967295


  BIGINT


  8


  -9223372036854775808


  9223372036854775807


  0


  18446744073709551615

  表格一共有四列分别表式:字段类型, 占用字节数, 允许存储的最小值, 允许存储的最大值.

  我们拿int类型为例:

  int类型, 占用字节数为4byte, 学过计算机原理的同学应该知道, 字节(byte)并非是计算机存储的最小单位, 还有比字节(byte)更小的单位, 也就是位(bit),一个位就代表一个0或1; 8个位组成一个字节; 一般字节用大写B来表示byte, 位用小写b来表示bit.

  计算机存储单位的换算:

  1B=8b

  1KB=1024B

  1MB=1024KB

  那么根据int类型允许存储的字节数是4个字节, 我们就能换算出int UNSIGNED(无符号)类型的能存储的最小值为0, 最大值为4294967295(即4B=32b, 最大值即为32个1组成);

  接下来我们再说说我们建表时的字段长度到底是怎么一回事.

  CREATE TABLE `test` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`number` INT( 5 ) NOT NULL
) ENGINE = MYISAM ;

  以test表的number字段为例, 大家看到我建的是int(5)

  mysql手册中这个长度/值用"M"来表示的. 细心的朋友应该有注意到过mysql手册上有这么一句话:  M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关;

  这句话看上去不太容易理解, 因为这里有个关键词容易让我们混淆, "最大显示宽度"我们第一反应是该字段的值最大能允许存放的值的宽度. 以为我们建了int(1),就不能存放数据10了, 其实不是这个意思.

  这个M=5我们可以简单的理解成为, 我们建立这个长度是为了告诉MYSQL数据库我们这个字段的存储的数据的宽度为5位数,  当然如果你不是5位数(只要在该类型的存储范围之内)MYSQL也能正常存储,  这也就能解释以上标红的话.

  我们把这个字段的"属性"修改为UNSIGNED ZEROFILL看一下效果.

  我们看到现在我的number字段, 长度(M)=5, 属性=UNSIGNED ZEROFILL(无符号,用0来填充位数),  设置这个属性后我往表时插入数据,系统会自动把number字段M不够5位的在左侧用0来填充; 效果如下

  手册上还有这么一句话"当 mysql 为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,mysql 信任地认为所有的值均适合原始的列宽度". 这也让我不禁感叹这个宽度到底如何设置比较合适

  但有一点看完该文档你应该清楚的知道, 长度M与你存放的数值型的数的大小无关.

时间: 2024-10-07 08:44:14

mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么的相关文章

Linux上检查MySQL数据表的存储引擎类型三板斧

MySQl主要使用两种存储引擎:MyISAM 和 Innodb.MyISAM是非事务的,因此拥有读取更快,然而InnoDB完全支持细颗粒度的事务锁定(比如:commit/rollback).当你创建一张新的MySQL表时,你要选择它的类型(也就是存储引擎).如果没有选择,你就会使用与预设置的默认引擎. 如果你想要知道已经存在的MySQL数据表的类型,这里有几种方法达到. 方法一 如果你可以访问phpMyAdmin,你可以从phpMyAdmin找出默认的数据库类型.从phpMyAdmin中选中数据

mysql多表查询的集中类型区别

1,内连接 inner join 内连接,也叫等值连接,inner join产生同时符合A表和B表的一组数据. 内连接语法 select * from A inner join B on A.name = B.name; 2,自然连接分类左连接 left join和右连接 right joinleft join,(或left outer join:在Mysql中两者等价,推荐使用left join.)左连接从左表(A)产生一套完整的记录,与匹配的记录(右表(B)) .如果没有匹配,右侧将包含nu

详解mysql int类型的长度值问题【转】

mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道int(1),这个长度1并不代表允许存储的宽度,但却没有一个合理的解释. 或者说对这个长度也没有真正的研究过到底代表什么, 平时都用int(11), 也不知道为什么要11位. 所以我在网上查阅了一些资料, 也仔细的看了mysql手册关于int data type的说法. 以下是每个整数类型的存储和范围(来自mysql手册) 类型 字

详解mysql int类型的长度值问题

我的朋友海滨问我mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道int(1),这个长度1并不代表允许存储的宽度,但却没有一个合理的解释. 或者说对这个长度也没有真正的研究过到底代表什么, 平时都用int(11), 也不知道为什么要11位. 所以我在网上查阅了一些资料, 也仔细的看了mysql手册关于int data type的说法. 以下是每个整数类型的存储和范围(来自mysql

mysql创建表的注意事项

1 库名,表名,字段名必须使用小写字母,"_"分割. 2 库名,表名,字段名必须不超过12个字符. 3 库名,表名,字段名见名识意,建议使用名词而不是动词. 4 建议使用InnoDB存储引擎.( InnoDB:支持事务安全的引擎,支持外键.行锁.事务是他的最大特点.如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况.) 5 存储精确浮点数必需使用DECIMAL替代FLOAT和DOUBLE.( float,double容易产生误差,对精确度

MySQL建表规范与常见问题

一. 表设计 库名.表名.字段名必须使用小写字母,"_"分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE. 建议使用UNSIGNED存储非负数值. 建议使用INT UNSIGNED存储IPV4. 整形定义中不添加长度,比如使用INT,而不是INT(4). 使用短数据类型,比如取值范围为0-80时,使用TINYINT UNSIGNED.

MySql性能调优(一)字段类型的选取之时间类型

时间类型: 1. 在MySql中支持5种时间类型,分别是DATE.TIME.DATETIME.TIMESTAMP和YEAR. 在日常建表中我们要优先使用timestamp类型,它有自动更新时间的功能,示例: 也可以设置不自动更新,只需默认值为空即可.如: 2. year(2)类型会自动转换为year(4)类型

MySQL之表的约束

一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充

MySQL之表操作

一.创建表 1.创建新表 #语法: create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #注意: 1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选 3. 字段名和类型是必须的 mysql> create table auth( -> id int(10) primary key auto_increment, -> name varchar(10) not null,