msyql int(x) 中x的误解

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

先看一个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):对于数字类型该校验的还是要校验,否则容易出现这样的问题.

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 SQL 关系型数据库
你对MySQL的int(11)真的了解吗?
首先,需要明确的是,int(3)和int(11)都是表示整数类型,而不是定义整数的存储长度。在MySQL中,INT类型占据4个字节(32位),可以存储范围是-2^31到2^31-1(约-2.1亿到2.1亿),这个范围是固定的,不受括号中数字的影响。
137 3
你对MySQL的int(11)真的了解吗?
|
关系型数据库 MySQL
【MySQL】tmp_table_size=64M,是干什么的?底层原理是什么?
【MySQL】tmp_table_size=64M,是干什么的?底层原理是什么?
196 0
|
存储 关系型数据库 MySQL
聊聊MySQL中的int(1)
聊聊MySQL中的int(1)
256 0
|
关系型数据库 MySQL 索引
MySQL关于Count你知道多少
count的含义:count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。
146 0
MySQL关于Count你知道多少
|
存储 关系型数据库 MySQL
Mysql 关于 int(1) 和 int(11) , 我必须要说一下了。
Mysql 关于 int(1) 和 int(11) , 我必须要说一下了。
457 0
Mysql 关于 int(1) 和 int(11) , 我必须要说一下了。
|
关系型数据库 MySQL
MySQL - COUNT(NULL)
MySQL - COUNT(NULL)
96 0
|
关系型数据库 MySQL
【MySQL】 unsigned使用
【MySQL】 unsigned使用
142 0
【MySQL】 unsigned使用
|
存储 关系型数据库 MySQL
mysql int(3)与int(10)的数值范围相同吗?
mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同。如果不同,分别是多大?以下回答解决你的疑惑。
155 0
mysql int(3)与int(10)的数值范围相同吗?
|
关系型数据库 MySQL
mysql find_in_set() 函数使用
mysql find_in_set() 函数使用
152 0
|
存储 关系型数据库 MySQL
MySQL的int (10) 和 int (11) 的区别
MySQL的int (10) 和 int (11) 的区别
298 0
MySQL的int (10) 和 int (11) 的区别