数据库int,char字段长度表示什么

栏目: 数据库 · 发布时间: 7年前

内容简介:先上结论:int字段的长度与你存储的数据长度char字段的长度与你存储数据长度

数据库int,char字段后面的长度是什么

先上结论:

int字段的长度与你存储的数据长度 无关 ,与显示有关

char字段的长度与你存储数据长度 有关

int字段长度

先介绍int,首先看下面的这张表

CREATE TABLE `test10` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `num1` int(3) DEFAULT NULL,
  `num2` int(6) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

新手:num1字段,能存储最大长度为3的整形

不好意思错了 ,int类型的存储大小为4个字节,一个字节8位,也就是2^32 。 int的取值范围(-2147483648 ~ 2147483647),最大能表示长度为10的数

在数据库中的int不管后面填的长度为多少,只要在int的取值范围内,都能够将你的存储的数正常放入。这就引来疑问了,那设置长度的意义是什么呢。

来看看官网的解释

“MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。“

这是官网的解释,意思就是位数不满足时,自动补充0,但不影响存储。

实践是检验真理的唯一标准。

insert into test10 (num1,num2) values('1','10');

看结果

select * from test10
+----+------+------+
| id | num1 | num2 |
+----+------+------+
|  3 |    1 |   10 |
+----+------+------+
1 row in set (0.01 sec)

发现并没有对我们刚刚插入的数据进行补齐,根据num1(3),num(6),按理说num1=001,num2=000010。

网上查了一下,知道原来是zerofill这个属性,没有加上

CREATE TABLE `test10` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `num1` int(3) DEFAULT NULL, #少了zerofill属性
  `num2` int(6) DEFAULT NULL, #少了zerofill属性
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

修改之后

test10` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `num1` int(3) unsigned zerofill DEFAULT NULL,
  `num2` int(6) unsigned zerofill DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4

查询

select * from test10;
+----+------+--------+
| id | num1 | num2   |
+----+------+--------+
|  3 |  001 | 000010 |
+----+------+--------+
1 row in set (0.01 sec)

补齐成功。

这下算是真正了解了int字段长度的含义了!

char字段长度

接着介绍char ,看下面这张表

CREATE TABLE `test20` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
 `char1` char(3)  DEFAULT NULL,
  `char2` char(6)  DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4

这时新手又会说了:既然int字段的长度不影响存储数据的大小,那么char也应该一样了。

不好意思又错了 ,char的取值范围为1~255个字节,每个汉字3个字节。

不管如何咱们先来按先前的操作来试验一遍好了

insert into test20 (char1,char2) values ('abcd','abcd');

看结果

select * from test20;
+----+-------+-------+
| id | char1 | char2 |
+----+-------+-------+
|  4 | a     | b     |
+----+-------+-------+
1 row in set (0.01 sec)

可以发现我们插入小于定义的长度,可以正常插入并且显示出来。那么插入比定义的长度大,会发生什么呢,让我们来试一试。

insert into test20 (char1,char2) values ('abcd','abcd');
ERROR 1406 (22001): Data too long for column 'char1' at row 1

可以看到,char1插入的‘abcd',比我们定义的数据要长,所以报错了。

有一点要提的是,char(6)如果你只存了‘abc’这样3位数据,它所占的存储空间还是6位的,多出来的三位会设置为空字符,这和varchar是有区别的。

那么就可以得出结论了,char定义的字段长度,是和要存储的数据长度有关系的。

如果要想了解一下各个字段类型的说明可以看下 字段数据类型

正好碰到zerofill这个属性,那么就学习一下

zerofill属性的作用

1、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0

2、zerofill默认为int(10)

3、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128~+127,无符号为0~256。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

We Are the Nerds

We Are the Nerds

Christine Lagorio-Chafkin / Hachette Books / 2018-10-2 / USD 18.30

Reddit hails itself as "the front page of the Internet." It's the third most-visited website in the United States--and yet, millions of Americans have no idea what it is. We Are the Nerds is an eng......一起来看看 《We Are the Nerds》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具