mysql字符串长度有影响吗varchar(255)和varchar(100)保存相同长度字符串有区别吗

使用varchar(255)的原因

学习mysql的时候,对于变长字段varchar会用额外一两个字节保存长度,当长度小于255个字节时,使用一个字节记录字符串的长度。如果大于255就使用两个字节保存字符串长度。知道这个后我就想如果只想保存10个字节的字段也没必要使用varchar(10),直接使用varchar(255)不就行了,反正小于保存数据255字节都只用额外的一个字节来保存长度信息。于是那段时间我写的sql,有什么好说的,管它三七二十一全部都varchar(255),管它要保存几个字节反正额外使用内存都一样
在这里插入图片描述
我看见其他同时同事喜欢使用varchar(10),varchar(100)……我还想,这兄弟这么吝啬,有什么用还不是一样的多用一个字节保存长度信息,直接varchar(255)一劳永逸不香吗?有点嘲笑的意思。乐呵呵的。到点下班准时走人美滋滋。

不用varchar(255)的原因

有一天我建立一个表的时候遇到了这个问题,mysql定义字段varchar(255)报错超长?就说255超长了,我人傻了,查资料发现索引不能太长,原来如此。索引长度不能超过767,而使用varchar(255)使用不同的编码限定的长度是不一样的,一般用UTF8字符所以255*4>767。大于了怪不得。开始担忧了,是不是以后使用utf8的时候默认设置varchar(255/4)了。查着资料突然想到一个问题,mysql设计者为什么不直接设置两种枚举,一种刚好使用一个字节保存字符串长度的,一种是使用两个字节保存字符串长度的,即只提供varchar(255)和varchar(65535 )两种选择不就得了,为啥要设计成用户可以自由设置长度?我相信肯定是还有其他原因,不然我想到他们肯定也能想到。

原来如此

经过进一步查资料发现,varchar(255)和varchar(5)保存字符串“aaaaa”使用磁盘空间一样的没错。但是当数据被读出来内存的时候,占用内存不一样的,比如将行从存储引擎层复制到SQL层时,VARCHAR将转换字段CHAR以获得利用固定宽度行的优势。因此,内存中的字符串将填充到声明的VARCHAR列的最大长度。
还有当查询隐式生成临时表时(例如在排序或是GROUP BY)也是一样会根据定义的长度分配内存而不是根据实际保存数据的多少。如果你使用很多VARCHAR(255)字段来存储不需要那么长的数据,这会使临时表变得非常大。

放弃varchar(255)吧

如何你也和我一样直接全部默认varchar(255)那么赶紧加班改吧,磁盘占用空间是一样的,但是当mysql处理这些数据的时候占用的内存是不一样的,也就是效率会不一样,还是老实点吧使用多少就设置多少,够用的情况下尽量短,不然领导看见你就得加班改了。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值