XxBlog

knowledge is power

我叫潘潘,来自成都,是一名 Java,Python 开发者,爱好广泛,热爱各种新技术,致力成为一名全栈开发工程师。


MySQL Varchar(255)是一个好的选择吗?

起因

最近看到一个代码规范,突然想到我自己一般都用varchar(255),但是一直想不通为什么要使用255这个长度。趁这个机会,把字段长度这块的知识汇总梳理一下。

为什么很多人会设置varchar(255)

MySQL 4.1版本之前,varchar的最大长度是255 byte字节(也有一说是5.0.3版本之前)。这个版本发布都是2004年的事情了。惯性真恐怖,我不相信有多少系统是从2004年升级过来的。

varchar(40)和varchar(255)有性能上的差别么?

对于INNODB,varchar(40)和varchar(255)这两者在存放方式上完全一样:

  • 当长度小于255时,1byte用于保存长度.
  • 当长度大于等于256时,2byte用于保存长度.

实际的字符串存放在另外的位置,每个字符1 byte到4 byte不定(根据编码方式决定)。 所以将一个字段从varchar(40)长度改成varchar(100)长度不会导致表的重建。但如果把长度从varchar(50)改成varchar(256)就不一样了,表示长度会需要用到2 byte。

那我们就可以把255长度以下的字段的类型都设置成varchar(255)了呢?非也。内存表会介意。虽然我们不会明文创建内存表,但所有的中间结果都会被数据库引擎存放在内存表。而内存表会按照固定长度来保存。以utf-8编码为例,对于varchar(255),每一行所占用的内存就是长度的2 byte + 3 * 255 byte。对于100条数据,光一个varchar字段就占约1GB内存。如果我们该用varchar(50),就可以剩下来约80%的内存空间。 除此之外,255长度也可能会引发一个索引的坑。MySQL在5.6版本及之前的最大长度是767 byte。但MySQL 5.5版本后开始支持4个byte的字符集utf8mb4。255 * 4 > 767,所以索引就放不下varchar(255)长度的字段了。虽然MySQL在5.7版本后将限制改成了3072 byte,但如果是多字段的联合索引还是有可能会超过这个限制。

varchar的最大长度是多少( 最多能存多少字符)

varchar的最大长度是65535 字节(byte)= 64K,对所有的表都是一样的。

  • 字符类型若为英文字母,每个字符占1个字节,最大长度 (65535 - 2) = 65533
  • 字符类型若为GBK,每个字符最多占2个字节,最大长度 (65535 - 2) / 2 = 32766 余 1
  • 字符字符类型若为UTF-8,每个字符最多占3个字节,最大长度 (65535 - 2) / 3 = 21844 余 1
  • 字符字符类型若为Utfmb4,每个字符最多占4个字节,最大长度 (65535 - 2) / 4 = 16383 余 1

定个规范

  • 名称字段:varchar(200)
  • 较长的名称字段/简介字段:varchar(500)
  • 特别长的描述字段: varchar(2000)
  • 超过2000中文字的字段:text
更早的文章

如何获取真实的客户端IP(防止客户端伪造)

利用X-Forwarded-For伪造客户端IP漏洞成因及防范问题背景在Web应用开发中,经常会需要获取客户端IP地址。一个典型的例子就是投票系统,为了防止刷票,需要限制每个IP地址只能投票一次。如何获取客户端IP在Java中,获取客户端IP最直接的方式就是使用 request.getRemoteAddr() ,这种方式能获取到连接服务器的客户端IP,在中间没有代理的情况下,的确是最简单有效的方式。但是目前互联网 Web 应用很少会将应用服务器直接对外提供服务,一般都会有一层Nginx做反...…

继续阅读