博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL中的int(11)和varchar(255)含义
阅读量:3952 次
发布时间:2019-05-24

本文共 2431 字,大约阅读时间需要 8 分钟。

int(11)含义及影响

转载自:https://www.cnblogs.com/chenmingjun/p/10556206.html

一、前言

在工作中经常要与 mysql 打交道,但是对 mysql 的各个字段类型一直都是一知半解,因此写本文总结记录一番。

二、简介

在这里插入图片描述

对于 int 类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用的 int(11) 代表什么意思,很长时间以来我都以为这代表着限制 int 的长度为 11 位,直到有天看到篇文章才明白,11 代表的并不是长度,而是字符的显示宽度,在字段类型为 int 时,无论你显示宽度设置为多少,int 类型能存储的最大值和最小值永远都是固定的,这里贴一些原文片段。

所以无论怎么设置 int 类型的显示宽度,int 所能存储的最大值和最小值是固定的,那么这个显示宽度到底有什么用呢?

当 int 字段类型设置为无符号且填充零(UNSIGNED ZEROFILL)时,当数值位数未达到设置的显示宽度时,会在数值前面补充零直到满足设定的显示宽度,为什么会有无符号的限制呢,是因为 ZEROFILL 属性会隐式地将数值转为无符号型,因此不能存储负的数值。

具体用以下代码解释。

首先创建一张表:

CREATE TABLE int_demo (    id INT(11) NOT NULL AUTO_INCREMENT,    a INT(11) NOT NULL,    b INT(11) UNSIGNED ZEROFILL NOT NULL,    c INT(5) DEFAULT NULL,    d INT(5) UNSIGNED ZEROFILL NOT NULL,    e INT(15) DEFAULT NULL,    PRIMARY KEY (`id`))

插入两条数据

INSERT INTO int_demo (a, b, c, d, e) VALUES (1, 1, 1, 1, 1);INSERT INTO int_demo (a, b, c, d, e) VALUES (1234567890, 1234567890, 1234567890, 1234567890, 1234567890);

select * from int_demo;

在这里插入图片描述

注释:如果用 navicate 软件查询出来并不会显示左边的 0,但把数据导出时可看到真实的数据,猜测是软件对数据格式进行了处理。

三、结论

从上个例子我们可以得出以下几个结论:

1、如果一个字段设置了无符号和填充零属性,那么无论这个字段存储什么数值,数值的长度都会与设置的显示宽度一致,如上述例子中的字段 b,插入数值 1 显示为00000000001,左边补了 10 个零直至长度达到 11 位;

2、设置字段的显示宽度并不限制字段存储值的范围,比如字段 d 设置为 int(5),但是仍然可以存储 1234567890 这个 10 位数字;

3、设置的字符宽度只对数值长度不满足宽度时有效,如 d 字段 int(5),插入 1 时,长度不足 5,因此在左边补充 4 个零直到 5 位,但是插入 1234567890 时超过了 5 位,这时的显示宽度就起不了作用了。

varchar(255)含义及影响

首先,varchar是动态字符串(跟上面的int不一样)长度是在括号里面指定的。

先看:

在utf8里面,对于汉字而言,一般一个汉字占用3个字节:参考:

很多时候我们设置varchar(255)都习以为常了,甚至我还遇到过有人以为varchar不能设置超过255的人。其实varchar没有明确最大长度,然后有人说那65535字节(bytes)不是吗?

但是事实上如果你用的 utf8 编码的话按理最大可以设置到 varchar(21845),但是其实一般都会说你超出。其实MySQL要求一个行定义长度不能超过 65535 bytes(所有字符串类型字段包括其字段名称占用空间都计算在内, text、blob等大字段类型除外)。

如下图我先设置了个21842成功了,后面加个长度为3的varchar都会报错,所有如果一个表有很多varchar字段的时候,不应该把varchar设置的特别大,会影响后面的字段

在这里插入图片描述

言归正传那为什么我们会经常性设置成varchar(255)呢?

首先我们要知道一个概念:InnoDB存储引擎的表索引的前缀长度最长是767字节(bytes)

你如果需要建索引,就不能超过 767 bytes;

utf8编码时 255*3=765bytes ,恰恰是能建索引情况下的最大值。(255是varchar长度,3是utf8占用的3个字节)

如果使用的是utf8mb4编码,默认字符长度则应该是 767除以4向下取整,也就是191。(因为编码长度变了)。

varchar(20) 和varchar(255)的开销

MySQL建立索引时如果没有限制索引的大小,索引长度会默认采用的该字段的长度,也就是说varchar(20)和varchar(255)对应的索引长度分别为:

20*3(utf-8)(+2+1)       255*3(utf-8)(+2+1),

其中"+2"用来存储长度信息,“+1”用来标记是否为空,加载索引信息时用varchar(255)类型会占用更多的内存; (备注:当字段定义为非空的时候,是否为空的标记将不占用字节)

在内存中的操作方式,varchar是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(255)是按照255这个长度来进行的。

MySQL通常会分配固定大小的内存块来保存内部值,255比20可大不少呢。

总结:varchar(255) 不是最优的字符长度,最优还是应该根据实际需要的来。但是这是一个保证你能少出错的一个很好的默认值。

你可能感兴趣的文章
资源&教程 | Python数据分析,详细的学习路径
查看>>
白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟
查看>>
中国癌症大数据出来了!每年126万例癌症死亡本可避免
查看>>
超全的 Linux 机器的渗透测试命令备忘表,共16表128条命令
查看>>
代码传奇 | 明明可以靠颜值 却用代码把人类送上了月球的女人——Margaret Hamilton
查看>>
教你用Java来玩答题(百万英雄/冲刺大会等)
查看>>
用Python做跳一跳外挂太浪费了,这种技能让你目瞪口呆
查看>>
如何在Python中快速进行语料库搜索:近似最近邻算法
查看>>
比特币这么火热,看看这篇比特币初学者指南
查看>>
快收藏! 30 分钟包你学会 AWK
查看>>
各平台的推荐算法,太贴切了!
查看>>
一张图学会Python3
查看>>
500款各领域机器学习数据集,总有一个是你要找的
查看>>
2017年终奖调查出炉 程序员年终奖多少你绝对猜不到
查看>>
写给大数据开发初学者的话 | 附教程
查看>>
分享 :17款工具,让你的数据更美观
查看>>
不必再费心寻找,2017最全的开发干货就在这1067页PDF里
查看>>
养蛙火爆,大数据解读《旅行青蛙》崛起之谜
查看>>
县级城市消费力排行榜,你的家乡排第几?
查看>>
红包外挂史及AccessibilityService分析与防御
查看>>