varchar(20) 和 varchar(255) 的区别,数据库表字段长度设计学习

本贴最后更新于 2011 天前,其中的信息可能已经时移世改

学习原因

在开发当中,经常看见有些字段长度是 varchar(20)或者 varchar(32),但是在自己建表的时候,navicat 基本上都是默认的 varchar(255)的长度。
所以带着疑问来学习一下数据库表字段长度的设计。

长度限制和字段选择

查阅了资料后,发现了一些关于数据库的长度限制及表设计的相关资料

相关资料:
各个数据库表名和字段名长度限制
MySQL 中各种数据类型的长度及在开发中如何选择
MySql 数据库表字段命名及设计规范
数据库中存储日期的字段类型到底应该用 varchar 还是 datetime
为什么很多公司要求 mysql 表主键 id 必须是 long 型?
为什么 mysql 的 varchar 字符长度会被经常性的设置成 255

在仔细阅读上述的相关资料后,算是解决了很多的疑问,也学习到了不少数据库书本上难以学习到的经验。
总的来说就是数据库表名和字段长度是有一个限制的,不是越大就好,在设计创建表字段时也要考虑下字段长度问题,根据一些实际情况选择表当中的字段类型和手动设置一下字段的长度,可以对数据的维护,查询带来效率和性能上的提升。

验证 varchar(20)和 varchar(255)的区别

关于这个问题,也在网上找了很多的资料进行查看,既然是学习嘛,光看是没有什么意思的,还是要动手验证一下。

相关资料:
varchar(500)比 varchar(8000)更有优势吗?
MySQL 中采用类型 varchar(20)和 varchar(255)对性能上的影响

创建一个测试表,并创建相关的字段,存入 1000 条数据。具体操作如下

CREATE TABLE ABC (
  id int(11) DEFAULT NULL,
  name varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建表
ALTER  TABLE  ABC  ADD  INDEX nameIndex (name);  -- 给name 字段添加索引
explain select name from ABC;    --  分析这个查询sql语句

结果如下图:
图片.png
在这里插入图片描述
可以看到此时的 KEY_LEN 为 63
然后往表里面存 1000 条数据,直接复制粘贴 1000 条一样的数据用于测试,查看表空间大小

SELECT CONCAT(TRUNCATE(SUM(data_length),2),'B') AS data_size,
CONCAT(TRUNCATE(SUM(max_data_length),2),'B') AS max_data_size,
CONCAT(TRUNCATE(SUM(data_free),2),'B') AS data_free,
CONCAT(TRUNCATE(SUM(index_length),2),'B') AS index_size
FROM information_schema.tables WHERE TABLE_NAME = 'ABC';

结果如下图:
图片.png
可以看见:data_size 的值为:16384
然后修改字段 name 的长度为 255,再次查看 key_len 和 data_size 的值

alter table ABC  modify name varchar(255);
explain select name from ABC;
SELECT CONCAT(TRUNCATE(SUM(data_length),2),'B') AS data_size,
CONCAT(TRUNCATE(SUM(max_data_length),2),'B') AS max_data_size,
CONCAT(TRUNCATE(SUM(data_free),2),'B') AS data_free,
CONCAT(TRUNCATE(SUM(index_length),2),'B') AS index_size
FROM information_schema.tables WHERE TABLE_NAME = 'ABC';

结果如下:
KEY_LEN 变成了 768 但是 data_size 没有变化。
验证完毕:得出结论,通常情况下使用 varchar(20)和 varchar(255)占用的空间都是一样的,但是使用索引长度有所不同。所以在设计时尽量保持一个合理的长度范围。

额外的发现

在测试当中还有一个些的发现:表字段的类型其实是有长度限制,int 类型最大为 255 等等。
一个表,所有字段的长度加起来不能超过 65535 字节,是字节不是字符 。不包括 text blob 类型的字段。

  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    690 引用 • 535 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    CSDN 的图片是不允许外链的。

    1 回复
  • hjljy
    作者

    感谢提醒 😄 😄