我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL text 能存多少个字符

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL text 能存多少个字符

MySQL text 能存多少个字符

前言

今天测试给提了个bug, 排查原因是插入数据时字段长度不够导致。我使用的是MySQL8的数据库,在给某个表新增一条数据,其中一个字段submit_info使用的是text的类型预设用来存储大的json字符串。之前对text到底能存多长的字符串没概念,恰好这次预到问题决定调查一下。这里记录一下

一、字符集字符长度和字节长度

首先需要知道字符长度和字节长度、和字符集,不同的字符集存储的中文字符时占的字节长度不一样。

MySQL在当前库中通过 show variables like '%char%';可查看当前数据库的字符集character_set_database->utf8mb4

show variables like ‘%char%’;

Variable_nameValue
character_set_clientutf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8mb4
character_set_filesystembinary
character_set_resultsutf8mb4
character_set_serverutf8mb4
character_set_systemutf8
character_sets_dirC:\Program Files\MySQL\MySQL Server 8.0\share\charsets\

utf8mb4字符集下英文占用1个字节长度,一般汉字占3-4个字节长度。可用 length(字段)char_length(字段)进行区分

select version(), submit_info,length(submit_info),char_length(submit_info) from appro_flow_main where id in(35,36);

version()submit_infolength(submit_info)char_length(submit_info)
8.0.18吕吕吕93
8.0.18aaa33

根据MySQL官网的资料显示,text的长度是 L < 2^16 = 65536个字节长度,注意这里是字节长度,而不是字符长度(varchar(n)这里的n是字符长度),所以说 text 在 character_set_database->utf8mb4 字符集下,大约能存 65535 / 3 = 21845个汉字 并不多,如果存json串实际上并存储不了多大的json对象尤其是包含中文比较多的情况下。

String Type Storage Requirements

In the following table, M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value.

Data TypeStorage Required
CHAR(*M*)The compact family of InnoDB row formats optimize storage for variable-length character sets. See COMPACT Row Format Storage Characteristics. Otherwise, M × w bytes, <= *M* <= 255, where w is the number of bytes required for the maximum-length character in the character set.
BINARY(*M*)M bytes, 0 <= *M* <= 255
VARCHAR(*M*), VARBINARY(*M*)L + 1 bytes if column values require 0 − 255 bytes, L + 2 bytes if values may require more than 255 bytes
TINYBLOB, TINYTEXTL + 1 bytes, where L < 2^8
BLOB, TEXTL + 2 bytes, where L < 2^16
MEDIUMBLOB, MEDIUMTEXTL + 3 bytes, where L < 2^24
LONGBLOB, LONGTEXTL + 4 bytes, where L < 2^32
ENUM('*value1*','*value2*',...)1 or 2 bytes, depending on the number of enumeration values (65,535 values maximum)
SET('*value1*','*value2*',...)1, 2, 3, 4, or 8 bytes, depending on the number of set members (64 members maximum)

二、验证案例

(一)表结构DDL和Java Entity

CREATE TABLE `appro_flow_main` (  `id` int(9) NOT NULL AUTO_INCREMENT COMMENT '物理主键id',  `flow_instance_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程实例号',  `flow_instance_name` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例名称',  `flow_no` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程号',  `appro_status` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程审核状态(进行中:1、已结束:0、保存:2、撤销)',  `submit_info` text COLLATE utf8mb4_general_ci COMMENT '提交信息json格式【元数据格式:name、key、value、type】',  `sponsor` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程发起人',  `initi_date` int(8) DEFAULT NULL COMMENT '流程发起日期',  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',  `table_id` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `uk_fin_fn` (`flow_instance_no`,`flow_no`)) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='审批流程主表'
@Data@Builder@NoArgsConstructor@AllArgsConstructor@TableName("appro_flow_main")public class FlowMain implements Serializable {    @TableId(type = IdType.AUTO)    private Integer id;    private String flowInstanceNo;    private String flowInstanceName;    private String flowNo;    private String approStatus;    private String submitInfo;    private String sponsor;    private Integer initiateDate;    private Integer branch;    private Date createTime;    private Date updateTime;}

(二)Java代码

使用的mybatis-plus 这里只给出核心代码。注意如果for循环里 i 从 0.0开始的话,第一条insert就会直接抛异常 text的最大长度是65535个字节长度,2^16 = 65536

    @Test    void createWorld() {        double num = Math.pow(2, 16);        System.out.println("长度:" + num);        StringBuilder sb = new StringBuilder();        StringBuilder cb = new StringBuilder();        for (double i = 1.0; i < num; i++) {            sb.append("吕");            cb.append("a");        }        flowMainMapper.insert(FlowMain.builder()                .flowNo("" + System.nanoTime())                .flowInstanceName("a")                .flowInstanceNo("aaa")                .submitInfo(cb.toString())                .build());        flowMainMapper.insert(FlowMain.builder()                .flowNo("" + System.nanoTime())                .flowInstanceName("a")                .flowInstanceNo("aaa")                .submitInfo(sb.toString())                .build());    }

控制台打印如下:

长度:65536.0Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@38f502fc] was not registered for synchronization because synchronization is not active2022-10-27 15:57:53.448  INFO 58032 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...2022-10-27 15:57:53.922  INFO 58032 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@1440325059 wrapping com.mysql.cj.jdbc.ConnectionImpl@521a506c] will not be managed by Spring==>  Preparing: INSERT INTO appro_flow_main ( flow_instance_no, flow_instance_name, flow_no, submit_info ) VALUES ( ?, ?, ?, ? )==> Parameters: aaa(String), a(String), 360639398372500(String), aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........<==    Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@38f502fc]Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4fc3529] was not registered for synchronization because synchronization is not activeJDBC Connection [HikariProxyConnection@954492773 wrapping com.mysql.cj.jdbc.ConnectionImpl@521a506c] will not be managed by Spring==>  Preparing: INSERT INTO appro_flow_main ( flow_instance_no, flow_instance_name, flow_no, submit_info ) VALUES ( ?, ?, ?, ? )==> Parameters: aaa(String), a(String), 360640025716500(String), 吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕吕..............Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4fc3529]org.springframework.dao.DataIntegrityViolationException: ### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'submit_info' at row 1### The error may exist in demo/mybatis/plus/dao/mapper/FlowMainMapper.java (best guess)### The error may involve demo.mybatis.plus.dao.mapper.FlowMainMapper.insert-Inline### The error occurred while setting parameters### SQL: INSERT INTO appro_flow_main  ( flow_instance_no, flow_instance_name, flow_no,  submit_info )  VALUES  ( ?, ?, ?,  ? )### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'submit_info' at row 1; Data truncation: Data too long for column 'submit_info' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'submit_info' at row 1

三、结论

实际上根据 以上的分析

  • text 可以存储 65535个字节=> 65535 (byte)/1024 ≈ 64KB 大小
  • 在utf8mb4的字符集下 text 最多可以存储 65535 / 3(一个汉字的占用字节长度) = 21845, 2万个左右的中文字符

由上可知,比较大的JSON串尤其是含中文较多的不适合使用text进行存储。根据需求使用 更长的 MEDIUMTEXTLONGTEXT

参考资料

来源地址:https://blog.csdn.net/LvQiFen/article/details/127557657

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL text 能存多少个字符

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文详解MySQL text能存多少个字符

目录前言一、字符集字符长度和字节长度二、验证案例(一)表结构DDL和Java Entity(二)Java代码三、结论总结前言今天测试给提了个bug, 排查原因是插入数据时字段长度不够导致。我使用的是mysql8的数据库,在给某个表新增一条
2023-01-13

一文详解MySQL text能存多少个字符

在我们使用mysql的时候,对字段的选用以及具体使用什么类型会很有疑问,下面这篇文章主要给大家介绍了关于MySQL text能存多少个字符的相关资料,需要的朋友可以参考下
2023-01-13

1KB内存最多能保存多少个ASCII码字符

这篇文章主要介绍“1KB内存最多能保存多少个ASCII码字符”,在日常操作中,相信很多人在1KB内存最多能保存多少个ASCII码字符问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”1KB内存最多能保存多少个AS
2023-06-25

一个Java字符串中有多少个字符

本篇内容主要讲解“一个Java字符串中有多少个字符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一个Java字符串中有多少个字符”吧!依照Java的文档, Java中的字符内部是以UTF-16编
2023-06-16

一个字符串中的字符有多少个

这篇文章给大家介绍一个字符串中的字符有多少个,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \\u0000 (0),最大值是\\ufff
2023-06-16

MySQL到底能有多少个字段

今天技术讨论群里 “一切随遇而安”同学看书时出现一个疑问,一个MySQL的表中到底可以有多少个字段?带着这个疑问,我们展开了探讨,也接着讨论了一个单字段长度的问题。1.  官方文档说明官方文档的内容如下,主要意思是字段个数限制达不到理想的4096个,且和字段类
MySQL到底能有多少个字段
2015-06-14

mysql中varchar(50)能存储多少汉字

mysql 中 varchar(50) 类型可存储最大 25 个汉字,具体受字符编码影响。例如,使用 utf-8 编码时可存储 16 个汉字,使用 gbk 编码时可存储 25 个汉字。需要注意,实际存储的空间会根据数据长度变化,超出限制时会
mysql中varchar(50)能存储多少汉字
2024-05-01

php怎么计算字符串有多少个m字符

两种计算方法:1、使用for语句循环遍历字符串中的字符,统计m字符的个数,语法“$con=0;for($i=0;$i
2022-07-04

php如何计算字符串有多少个m字符

本篇内容介绍了“php如何计算字符串有多少个m字符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两种计算方法:1、使用for语句循环遍历字符
2023-07-02

oracle中to_char()能存多少汉字

oracle 的 to_char() 函数可以存储汉字,数量取决于字符集、字符宽度和数据类型。在 utf-8 字符集中,varchar2 变量可存储约 1333 个汉字,而 clob 变量可存储约 133 万个汉字。存储数量会因字符宽度和内
oracle中to_char()能存多少汉字
2024-05-07

解读MySQL中一个B+树能存储多少数据

目录www.cppcns.commysql中一个aIghdIdFFB+树能存储多少数据MySQL聚簇索引的存储结构MySQL中B树与B+树的区别B树B+树B树与B+树的区别总结MySQL中一个B+树能存储多少数据MySQL聚簇索引的存储结
2023-02-14

mysql一张表最多能存多少数据

mysql单表的存储上限受操作系统、文件系统和存储引擎的影响:在32位系统上,上限约为4gb。在64位系统上,理论上限为16eb。innodb存储引擎由多个段和页组成,最多可有65,536个页,总容量约为1tb。行大小、索引大小、行格式、压
mysql一张表最多能存多少数据
2024-08-01

mysql regexp匹配多个字符串实现

目录项目场景:解决方案:使用myBATis实现项目场景:数据结构其中nameArr存储的是名字集合,现在的需求是传入"aaa","fff",需要把包含这两个name的数据都查出来。解决方案:可以使用REGEXP来匹配包含多个特定ID的
mysql regexp匹配多个字符串实现
2024-09-18

mysql一个表可以存多少条数据

mysql表的存储容量取决于表结构、存储引擎和服务器配置。最大行数为922亿,最大表大小为64tb(非压缩)或32tb(压缩)。实际限制和性能考虑会影响实际容量。MySQL表中可存储数据的数量MySQL中一个表可以存储的数据量取决于多种因
mysql一个表可以存多少条数据
2024-04-22

编程热搜

目录