msyql int(x) 中x的误解

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

这个问题是很久以前就发现的问题一直没有整理,今天有个朋友又问到这个问题。

先看一个MySQL表结构

Sql代码
  1. CREATE   TABLE  `test` (  
  2.   `TYPEID` int (2)   
  3. ) ENGINE=MyISAM CHARSET=latin1;  
Sql代码   收藏代码
  1. CREATE TABLE `test` (  
  2.   `TYPEID` int(2)   
  3. ) ENGINE=MyISAM CHARSET=latin1;  

    对于test表字段中的typeId 后面的 int(2)中的2代表的到底是什么含义。

     对于大多数的人来说我们马上想到的是varchar(2)后面的2代表为两个字节,也就不难把int后的2误认为2位即typeId的最大存入的数为99【俺以前也一直这么认为的】 

     这样的想法一直延续的有个项目,对于数值类型只能在100内的字段忘记作校验就给插入数据库,测试的同事了把一个千位数插入,竟然插入并且数据库中数据也 正确。汗,当时我的第一反应是测试服务器的表创建错误,检查一遍没有啊。回到本地也测试了下发现也存在这个问题。逼的没办法了就上网上找资料,终于找到了 以下说明。

     对于mysql的int来说它的长度是不变的及为4个字节、对于插入数据数据大小也是不变的。

     带符号的数值大小范围为:-2147483648 到214748347

     无符号的:0到4294967295

     int(x)的x并不能改变int类型字段存入数据值的大小【即不能限制数值的范围】

     举个示例说

    int(2)能存入214748347。

    int(1)也能存入214748347。

    示例使用test表为例

 

C#代码
  1. insert into test value( <strong>214748347</strong>  
  2. );  
C#代码   收藏代码
  1. insert into test value( <strong>214748347</strong>  
  2.   
  3. );  

    发现能插入,整个过程如下:

     int(2)能插入214748347。

    那int(x)的x到底是什么,x为期望显示数据的列宽。

    期望列宽干什么用,这个是和mysql的另外的关键字zerofill一起使用

    zerofill 含义代表为未到达宽度x的前填充0【或称为0补位】,超出x代表宽度的数值按原样显示。

     备注:zerofill自动将int标示为无符号的类型

                  无该关键代表不填充,按原值显示。

  示例如下

    过程如下

Sql代码
  1. CREATE   TABLE  `tZfill` (  
  2.   `TYPEID` int (4) zerofill   
  3. ) ENGINE=MyISAM CHARSET=latin1;  
  4. insert   into  tZfill value( 12 );  
  5. insert   into  tZfill value(  558585 );  
  6. select  *  from  tZfill;  
Sql代码   收藏代码
  1. CREATE TABLE `tZfill` (  
  2.   `TYPEID` int(4) zerofill   
  3. ) ENGINE=MyISAM CHARSET=latin1;  
  4. insert into tZfill value( 12 );  
  5. insert into tZfill value(  558585 );  
  6. select * from tZfill;  

    整个执行过程

   

     mysql中的TINYINT、SMALLINT等数据类型都是这样表示。

    (1): 这样可以看出mysql对于数值类型来说不管是多大的数它的存储大小没有改变【该占几个字节还是占几个字节,不因期望存储宽度即x而改变】,所以我们开发时候的选择合适的数值类型能用小的存储位数的就用小的。

    (2):对于数字类型该校验的还是要校验,否则容易出现这样的问题.

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 SQL 关系型数据库
你对MySQL的int(11)真的了解吗?
首先,需要明确的是,int(3)和int(11)都是表示整数类型,而不是定义整数的存储长度。在MySQL中,INT类型占据4个字节(32位),可以存储范围是-2^31到2^31-1(约-2.1亿到2.1亿),这个范围是固定的,不受括号中数字的影响。
225 3
你对MySQL的int(11)真的了解吗?
|
4月前
|
存储 关系型数据库 MySQL
在 MySQL 中使用 CHAR
【8月更文挑战第11天】
86 0
|
6月前
|
关系型数据库 MySQL 开发者
Mysql COUNT() 函数详解
【6月更文挑战第19天】Mysql COUNT() 函数详解,包括 COUNT() 的用法及 COUNT() 带条件查询的操作
|
7月前
|
SQL 关系型数据库 MySQL
unsigned int 虽然mysql支持,但是不建议使用,因为可能在未来某个版本删除
unsigned int 虽然mysql支持,但是不建议使用,因为可能在未来某个版本删除
51 2
|
存储 关系型数据库 MySQL
MySQL 中 int (10) 和 char (10) 和 varchar (10) 的区别
MySQL 中 int (10) 和 char (10) 和 varchar (10) 的区别
182 0
|
关系型数据库 MySQL 索引
MySQL关于Count你知道多少
count的含义:count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。
186 0
MySQL关于Count你知道多少
|
存储 关系型数据库 MySQL
聊聊MySQL中的int(1)
聊聊MySQL中的int(1)
292 0
|
存储 关系型数据库 MySQL
Mysql 关于 int(1) 和 int(11) , 我必须要说一下了。
Mysql 关于 int(1) 和 int(11) , 我必须要说一下了。
592 0
Mysql 关于 int(1) 和 int(11) , 我必须要说一下了。
|
关系型数据库 MySQL
【MySQL】 unsigned使用
【MySQL】 unsigned使用
172 0
【MySQL】 unsigned使用
|
关系型数据库 MySQL
【MySQL】begin ... end一直报错
【MySQL】begin ... end一直报错
295 0
【MySQL】begin ... end一直报错