iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL text 能存多少个字符
  • 131
分享到

MySQL text 能存多少个字符

mysql数据库sql 2023-09-09 10:09:38 131人浏览 泡泡鱼
摘要

Mysql text 能存多少个字符 前言 今天测试给提了个bug, 排查原因是插入数据时字段长度不够导致。我使用的是mysql8的数据库,在给某个表新增一条数据,其中一个字段submit_inf

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

您可能感兴趣的文档:

--结束END--

本文标题: MySQL text 能存多少个字符

本文链接: https://www.lsjlt.com/news/401308.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MySQL text 能存多少个字符
    MySQL text 能存多少个字符 前言 今天测试给提了个bug, 排查原因是插入数据时字段长度不够导致。我使用的是MySQL8的数据库,在给某个表新增一条数据,其中一个字段submit_inf...
    99+
    2023-09-09
    mysql 数据库 sql
  • 一文详解MySQL text能存多少个字符
    目录前言一、字符集字符长度和字节长度二、验证案例(一)表结构DDL和Java Entity(二)Java代码三、结论总结前言 今天测试给提了个bug, 排查原因是插入数据时字段长度不够导致。我使用的是mysql8的数据库...
    99+
    2023-01-13
    mysql text字符 mysql字符存储
  • 一文详解MySQL text能存多少个字符
    目录前言一、字符集字符长度和字节长度二、验证案例(一)表结构DDL和Java Entity(二)Java代码三、结论总结前言 今天测试给提了个bug, 排查原因是插入数据时字段长度不...
    99+
    2023-01-13
    mysql text字符 mysql字符存储
  • 1KB内存最多能保存多少个ASCII码字符
    这篇文章主要介绍“1KB内存最多能保存多少个ASCII码字符”,在日常操作中,相信很多人在1KB内存最多能保存多少个ASCII码字符问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”1KB内存最多能保存多少个AS...
    99+
    2023-06-25
  • 一个字符串中的字符有多少个
    这篇文章给大家介绍一个字符串中的字符有多少个,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \\u0000 (0),最大值是\\ufff...
    99+
    2023-06-16
  • 一个Java字符串中有多少个字符
    本篇内容主要讲解“一个Java字符串中有多少个字符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一个Java字符串中有多少个字符”吧!依照Java的文档, Java中的字符内部是以UTF-16编...
    99+
    2023-06-16
  • mysql中varchar(50)能存储多少汉字
    mysql 中 varchar(50) 类型可存储最大 25 个汉字,具体受字符编码影响。例如,使用 utf-8 编码时可存储 16 个汉字,使用 gbk 编码时可存储 25 ...
    99+
    2024-05-01
    mysql
  • MySQL的varchar最长可支持多少个字符?
    MySQL是一种常用的关系型数据库管理系统,它支持多种数据类型,其中包括varchar类型。varchar是一种可变长度的字符类型,用于存储字符串。那么,MySQL的varchar最长可支持多少个字符呢?本文将为您解答这个问题。 varc...
    99+
    2023-09-27
    mysql 数据库
  • php如何计算字符串有多少个m字符
    本篇内容介绍了“php如何计算字符串有多少个m字符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两种计算方法:1、使用for语句循环遍历字符...
    99+
    2023-07-02
  • 域名最多可以注册多少个字符
    域名最多可以注册67个字符。域名最多可以注册67个字符,而注册域名时可以使用以下字符来作为域名:26个英文字母,A ~ Z(注意:字母不区分大小写)。10个阿拉伯数字,0 - 9。横杠字符“-”(注意:不能用作开头和结尾)。...
    99+
    2024-04-02
  • oracle中to_char()能存多少汉字
    oracle 的 to_char() 函数可以存储汉字,数量取决于字符集、字符宽度和数据类型。在 utf-8 字符集中,varchar2 变量可存储约 1333 个汉字,而 c...
    99+
    2024-05-07
    oracle
  • 解读MySQL中一个B+树能存储多少数据
    目录mysql中一个B+树能存储多少数据MySQL聚簇索引的存储结构MySQL中B树与B+树的区别B树B+树B树与B+树的区别总结MySQL中一个B+树能存储多少数据 MySQL聚簇索引的存储结构 MySQL中Inno...
    99+
    2023-02-14
    MySQL B+树 B+树存储数据 MySQL B+树存储数据
  • 如何求一个字符串中有多少个pat
    本篇内容介绍了“如何求一个字符串中有多少个pat”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!有几个pat...
    99+
    2024-04-02
  • php字符串最大多少
    本教程操作环境:Windows7系统、PHP7.0.0版、Dell G3电脑。php字符串最大多少从 PHP 7.0.0 开始,对于 64 位版本的字符串长度没有特别的限制.在 32 位版本和早期版本中,字符串最大可达 2GB(最大 214...
    99+
    2022-11-29
    字符串 php
  • mysql一个表可以存多少条数据
    mysql表的存储容量取决于表结构、存储引擎和服务器配置。最大行数为922亿,最大表大小为64tb(非压缩)或32tb(压缩)。实际限制和性能考虑会影响实际容量。 MySQL表中可存储...
    99+
    2024-04-22
    mysql
  • css3如何设置一行显示多少个字符
    本篇内容主要讲解“css3如何设置一行显示多少个字符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3如何设置一行显示多少个字符”吧! ...
    99+
    2024-04-02
  • 你的mysql到底能存多少数据呢?
    前言 参考借鉴文章 我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知? 这里自己在总结一下,原因是相关知识欠缺,看别人的文章研究很久才弄明白,所以这里记录一些心得。 作者:阿杆 ...
    99+
    2023-09-08
    mysql java 数据库
  • mysql数据库能储存多少条数据
    小编给大家分享一下mysql数据库能储存多少条数据,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL是中小型网站普遍使用的...
    99+
    2024-04-02
  • MySQL一张表能存的数据是多少
    这篇“MySQL一张表能存的数据是多少”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyS...
    99+
    2023-02-02
    mysql
  • mysql int类型存储时需要多少字节
    本篇内容主要讲解“mysql int类型存储时需要多少字节”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql int类型存储时需要多少字节”吧! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作