当前位置: 首页 > news >正文

MySQL 表varchar字段长度估算

VARCHAR(n) 中的 n 表示的是 字符数,不是字节数。
VARCHAR(100) 表示该字段最多可以存储 100个字符,不管这些字符是 ASCII(1字节)还是中文/表情符号(可能是2~4字节)。

要注意:字符集不同,存储时实际占用的字节也不同。
字符集, 每个字符最大占用字节;
latin1, 1 字节;
utf8,3 字节(最多);
utf8mb4, 4 字节(最多);

存储限制提醒:
MySQL 每一行(row)总共最多不能超过 65,535 字节(不包含 BLOB/TEXT 的外部存储),所以:

VARCHAR(1000) 在 utf8 下,最多会占 1000 × 3 = 3000 字节
如果有多个 VARCHAR 字段,要注意总字节大小不能超限


怎么估算实际字符串的长度和字段选型呢,搞一下嘛,拿尺子量一量。
下面是MySQL 表字段长度估算脚本和表设计规范模板表格,用于字段设计时估算存储空间,非常适合日常建表用来把控大小和性能。


一、实际存储空间估算脚本

以下是Java版本的代码,用于:估算每一行数据所占的最大存储字节数,支持 UTF8、UTF8MB4 等字符集。

public class MysqlStorageCalculator {// 计算VARCHAR字段的最大字节数:字符数 × 每字符最大字节数 + 长度前缀(1~2 字节)public static int estimateVarcharBytes(int charLength, String charset) {int bytesPerChar;switch (charset.toLowerCase()) {case "utf8mb4":bytesPerChar = 4;break;case "utf8":bytesPerChar = 3;break;case "latin1":bytesPerChar = 1;break;default:bytesPerChar = 3; // 默认按utf8}int payload = charLength * bytesPerChar;// 加上长度前缀:如果payload > 255, 用2字节,否则用1字节int prefix = (payload > 255) ? 2 : 1;return payload + prefix;}public static void main(String[] args) {System.out.println("估算 VARCHAR(500) 使用 UTF8 字符集所需空间: "+ estimateVarcharBytes(500, "utf8") + " 字节");System.out.println("估算 VARCHAR(500) 使用 UTF8MB4 字符集所需空间: "+ estimateVarcharBytes(500, "utf8mb4") + " 字节");System.out.println("估算 VARCHAR(1000) 使用 latin1 字符集所需空间: "+ estimateVarcharBytes(1000, "latin1") + " 字节");}
}

二、字段设计规范表格模板

字段名数据类型字符集最大字符数实际最大字节说明
usernameVARCHAR(50)utf8mb45050×4 + 1 = 201用户名,支持表情
emailVARCHAR(100)utf8100100×3 + 2 = 302邮箱地址
descriptionTEXTutf8mb4~64KB特殊处理长文本建议 TEXT 存储
create_timeDATETIME--8 字节建议用 DATETIME(3) 精度
statusTINYINT(1)--1 字节状态字段,建议枚举
json_dataJSONutf8mb4取决于内容不建议太大结构化内容建议建子表

使用建议

  • 避免所有字段都用 VARCHAR(500),实际用不到反而浪费空间。

  • 表字段控制在 单行不超过 8KB~16KB 较为稳妥(尤其是在 InnoDB 页大小为 16KB 时)。

  • utf8mb4 必须小心(emoji 表情、高字节字符)。

http://www.xdnf.cn/news/16525.html

相关文章:

  • 预防网站被劫持
  • WordPress自定义页面与文章:打造独特网站风格的进阶指南
  • 嵌入式C语言位操作的几种常见用法
  • springcloud alibaba
  • FreeRTOS菜鸟入门(七)·创建任务·静态任务创建
  • P10416 [蓝桥杯 2023 国 A] XYZ
  • 如何精通C++编程?
  • shell脚本
  • 基于Atlas 800I A2 + Ubuntu 22.04 LTS 离线部署神州鲲泰问学一体机平台
  • 大模型能否真正实现通用人工智能(AGI)?
  • 目标检测中的混淆矩阵
  • IE之路专题12.BGP专题
  • IDEA MyBatisCodeHelper Pro插件高版本解密
  • docker 部署服务工具记录
  • ChatGPT-o3辅助学术大纲效果如何?
  • helloword 1(安卓逆向工具简单利用)
  • vue中textarea标签高度自适应文本高度(解决方案)
  • 6.8.最小生成树
  • 中华传承-医山命相卜-易经
  • 如何批量在多个 Word 文档末尾添加广告页面
  • 6.6.图的广度优先遍历(英文缩写BFS)
  • 在ubuntu中VsCode使用python docker容器
  • 工厂方法模式详解及c++代码实现(以自动驾驶感知模块中的应用为例)
  • 三维点拟合平面ransac c++
  • JAVA设计模式:注解+模板+接口
  • 解锁健康生活:养生新主张
  • 【AI飞】AutoIT入门七(实战):python操控autoit解决csf视频批量转换(有点难,AI都不会)
  • 汽车行驶工况特征参数:从“速度曲线”到“驾驶DNA”的硬核解码
  • Linux:命令行参数、环境变量
  • ES6 Object.values 特定字段处理