Mysql 为什么默认定义varchar(255) 而不是varchar(256)

今天在生产预备完成10点后执行表新增,多了个心眼,让DBA看一下新增字段语句是不是有影响。因为生产数据库数据实在太多了,不敢随意的新增字段以及索引。

mysq新增字段ddl

ALTER TABLE kohala_ucs.t_single_extra MODIFY personal_sign varchar(256) NULL DEFAULT '' COMMENT '个性签名';

DBA看过后只说了一句,256修改为255,然后晚上10点后执行。我当时在想,我一直建表都是32,64,128,256,512,1024长度,为何要255呢。只能去网上搜搜为何?

先抛出官网答案:

In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.

简单翻译一下就是

char, varchar类型的值,会有一个长度标识位来存值长度。
当定义varchar长度小于等于255时,长度标识位需要一个字节;
当大于255时,长度标识位需要两个字节

也就是说,当我们定义一个varchar(255)的字段时,其实它真实使用的空间是256(255+1)字节;(注意,字段非空,latin1编码
当我们定义一个一个varchar(256)字段时,它真实使用的空间是258(256+2)字节

我们DBA给的答复是:

因为超过256会申请额外的空间,进行全表锁表,然后进行新增字段,故在高并发的情况下,肯定会影响数据库性能。

现在大家明白了为何要设置255了吧

 

  • 3
    点赞
  • 1
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值