varchar(20)和varchar(50)是一样的吗?

Hab*_*wad 8 mysql varchar

我看到评论"如果varchar(20)列中有10到15个字符之间有5000万个值,而varchar(50)列中有5000万个值,它们将占用完全相同的空间.这就是整点varchar,而不是char." 任何人都可以告诉我原因吗?请参阅人员"姓名"字段的合理长度限制是什么?

Jir*_*ika 9

MySQL提供了多种存储引擎选择.数据的物理存储取决于存储引擎.

VARISAR的MyISAM存储

在MyISAM中,VARCHARs通常仅占用字符串的实际长度加上一个或两个长度.通过MyISAM对表锁定的设计限制而不是行锁定功能,这是实用的.性能结果包括更紧凑的缓存配置文件,但也包括更复杂(更慢)的记录偏移计算.

(事实上​​,MyISAM 在固定物理行大小和可变物理行大小表格式之间提供了一定程度的选择,具体取决于整个表中出现的列类型.VARCHAR仅更改默认方法,但是TEXTblob 的存在会强制 VARCHAR进入同一个表也使用变长方法.)

物理存储方法对于索引尤其重要,索引与表格不同.MyISAM对两个CHARVARCHAR使用空间压缩,意味着在两种情况下,较短的数据占用索引中较少的空间.

VARoAR的InnoDB存储

与大多数其他当前关系数据库一样,InnoDB使用更复杂的机制. VARCHAR最大宽度小于768字节的列将以内联方式存储,其中房间保留与最大宽度匹配.这里更准确:

对于每个非NULL可变长度字段,记录头包含一个或两个字节的列长度.如果列的一部分存储在溢出页面的外部,或者最大长度超过255个字节且实际长度超过127个字节,则只需要两个字节.对于外部存储列,双字节长度表示内部存储部分的长度加上指向外部存储部分的20字节指针.内部部分为768字节,因此长度为768 + 20.20字节指针存储列的真实长度.

InnoDB目前不在其索引中进行空间压缩,与MyISAM相反,如上所述.

回到问题

然而,上述所有内容只是一个实现细节,甚至可能在版本之间发生变化.之间的真正区别CHARVARCHAR是语义的,所以是之间的一个VARCHAR(20)VARCHAR(50).通过确保无法在a中存储30个字符的字符串VARCHAR(20),数据库使各种处理器和应用程序的生活更轻松,更好地定义,它应该集成到可预测的行为解决方案中.这是大问题.

关于个人姓名,这个问题可能会给你一些实际的指导.全名超过70个UTF-8字符的人无论如何都会遇到麻烦.