mysql 存储汉字长度_MySQL-没有必要的varchar255长度及存储汉字问题汇总

本文探讨了MySQL中varchar字段长度设置的规范,指出长度设置应根据实际需求尽量短,而不是默认采用varchar(255)。内容涉及MySQL 4.1之前的varchar最大长度限制,内存表对内存消耗的影响,以及不同字符集下的最大字符数。同时,文章提醒注意索引长度限制,以及在存储汉字时如何选择适当的字段长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bc3f9276acf88283a0569b9b9ef9ee92.png

在线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和存储汉字摘要/?]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值