这个问题是很久以前就发现的问题一直没有整理,今天有个朋友又问到这个问题。
先看一个mysql表结构
CREATE TABLE `test` ( `TYPEID` int(2) ) 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表为例
insert into test value( 214748347 );
发现能插入,整个过程如下:
int(2)能插入214748347。
那int(x)的x到底是什么,x为期望显示数据的列宽。
期望列宽干什么用,这个是和mysql的另外的关键字zerofill一起使用
zerofill 含义代表为未到达宽度x的前填充0【或称为0补位】,超出x代表宽度的数值按原样显示。
备注:zerofill自动将int标示为无符号的类型
无该关键代表不填充,按原值显示。
示例如下
过程如下
CREATE TABLE `tZfill` ( `TYPEID` int(4) zerofill ) ENGINE=MyISAM CHARSET=latin1; insert into tZfill value( 12 ); insert into tZfill value( 558585 ); select * from tZfill;
整个执行过程
mysql中的TINYINT、SMALLINT等数据类型都是这样表示。
(1): 这样可以看出mysql对于数值类型来说不管是多大的数它的存储大小没有改变【该占几个字节还是占几个字节,不因期望存储宽度即x而改变】,所以我们开发时候的选择合适的数值类型能用小的存储位数的就用小的。
(2):对于数字类型该校验的还是要校验,否则容易出现这样的问题.
相关推荐
13. 删除MySQL的用户并不会自动删除该用户创建的表,这是对用户权限和操作的误解。 14. SQL中最常用的数据操纵语句是SELECT,用于查询数据。 15. 在HTML中,定义书签使用`<a name>`标签。 16. INT类型的字段不受...
5. 静态变量与递归:题目中的C语言程序展示了静态变量在递归调用中的行为,`fun()`函数的静态变量`x`每次调用都会累加,因此最终`main()`函数结束时,`s`的值为1+2+4=7,所以选项D是正确的。 6. 计算机网络类型:...
- **解析**:在 MySQL 中,删除用户不会自动删除该用户创建的表。需要手动删除或更改表的所有者。 ### 19. Java 程序逻辑 - **输出结果**:4,3,7 - **解析**:该程序通过使用嵌套函数 `f1` 和 `f2` 来确定最大值...
- **存储过程**: 在MySQL中,存储过程可以通过`CALL`语句来调用。例如,如果有一个名为`sp`的存储过程,那么调用它的语法为`CALL sp()`。 - **函数**: MySQL中的用户定义函数通常通过`SELECT`语句来调用。例如,如果...
- **详细解释**:在C++中,选项A(a%(int)(x-y))是正确的。这里使用了取模运算符和类型转换,表示计算a除以(x-y)的结果的整数部分的余数。 ### 10. C++程序的基本单位 - **知识点**:C++程序的基本组成单元。 - **...
- 关于SQL语句声明的例子,正确使用`DECLARE tmpVar TYPE CHAR(10) DEFAULT "MySQL"`来声明一个变量。这表明在SQL中,可以使用DECLARE语句来声明和初始化变量。 以上是根据提供的文档信息整理的关键知识点,涉及了...