在线QQ客服:1922638
专业的SQL Server、MySQL数据库同步软件
最近,正在整理代码规范。根据Oracle的习惯,设置了以下字段长度设置规范:
名称字段:varchar(200)
长名字段/简介字段:varchar(500)
特别长的描述字段:varchar(2000)
具有超过2000个汉字的字段:文本
为什么长度为200,而不是100或300,也被认为拍了拍头,类似于DND中的房屋规则。
但是当被问到为什么我通常不将其设置为varchar(255)时,我目前无法回答。利用这个机会来总结字段长度的知识。
在MySQL 4.1之前,varchar的最大长度为255字节字节(在5.0.3之前还有一个版本)。检查该版本是否于2004年发布。惯性令人恐惧。我不相信从2004年开始升级了多少系统。
对于INNODB,存储方法与两者完全相同:1-2字节的存储长度,实际的字符串存储在另一个位置,每个字符为1字节至4字节不确定(取决于编码和实际存储)字符)。因此,将字段从varchar(50)长度更改为varchar(100)长度将不会导致表重构。但是,如果将长度从varchar(50)更改为varchar(256),则意味着该长度将需要使用2个字节或更多。
由于INNODB的长度小于255,并且我们通常根本不使用MYISAM,因此,出于担心,我们可以将255以下的字段类型设置为varchar(255),这是什么?
不会吧
因为内存表介意。
尽管我们不会以纯文本形式创建内存表,但是所有中间结果将由数据库引擎存储在内存表中。我们可以使用EXPLAIN或SHOW STATUS来检查MYSQL是否使用内存表来帮助完成操作。
内存表将按照固定的长度保存。以utf-8编码为例,对于varchar(255),每行占用的内存长度为2字节+ 3 * 255字节。对于100条数据,单个varchar字段占用大约1GB的内存。如果应该使用varchar(50),则可以保留大约80%的内存空间。
另外,长度255也可能导致索引凹坑。 MySQL 5.6及之前版本的最大长度为767字节。但是,在MySQL 5.5版之后,它开始支持4字节字符集utf8mb4(沙雕表达式中使用的字符太多,并且长度不够)。 255 * 4 767,因此无法将varchar(255)字段放置在索引中。尽管MySQL在5.7版本之后将限制更改为3072字节,但是如果它是一个多字段联合索引,它仍可能超过此限制。
因此,我们的结论是:如果长度足够,则越短越好。
varchar的最大长度为65535字节。所以
如果字符类型为gbk,则每个字符最多可占用2个字节,并且最大长度不能超过32766个字符
如果字符类型为utf8,则每个字符最多可占用3个字节,并且最大长度不能超过21845个字符
如果字符类型为utf8mb,则每个字符最多可占用4个字节,并且最大长度不能超过16383个字符。
但是通常varchar的长度限制通常是由一行定义的长度,这是表中定义的所有字段的长度的总和。此限制也是65535字节。如果超过长度,将报告错误:
1个
错误1118(42000):行大小太大。使用的表类型的最大行大小(不计BLOB)为65535。您必须将某些列更改为TEXT或BLOB。
这就是Ali开发规范要求这样做的原因:
1个
[必须] Varchar是可变长度的字符串,没有预先分配存储空间,并且长度不能超过5000。如果存储长度大于该值,则将字段类型定义为text,并使用避免影响其他字段的主键。索引效率。
以前的SQL Server的nvarchar对Oracle的varchar2的固有印象使我始终觉得保存中文文本时varchar的长度需要折半或除以3。
但这也是MySQL 5.0版本之前的事情。现在varchar(n)是几个,您可以保存几个汉字。
但是还需要注意使用CHARACTER_LENGTH而不是LENGTH
1个
2
3
4
-返回12
SELECT LENGTH("轻松工作");
-返回4
SELECT CHARACTER_LENGTH("轻松工作");
为什么不使用PostgreSQL而不是MySQL?
与MySQL相比,我个人更喜欢PostgreSQL,从各种设计细节上我都感到非常标准化。但是无奈的国内分布式数据库解决方案基本上是基于MySQL的。 。 。尽管我们的情况认为今年暂时不需要分发,但可以的话。 。 。
先动者的优势是可怕的。
感谢您对stackexchange的详细解答
数据库设计-MySQL-varchar的长度和性能-数据库管理员堆栈交换
有关内存表的详细介绍
MySQL·功能分析·内部临时表
关于为什么索引长度限制为767字节或3072字节的详细说明
有关InnoDB索引长度限制的提示
永久链接到这篇文章[? https://galaxyyao.github.io/2019/07/30/MySQL-不需要varchar-255-Length和存储汉字摘要/?]