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

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

mysql text字符mysql字符存储 2023-01-13 12:01:24 118人浏览 八月长安
摘要

目录前言一、字符集字符长度和字节长度二、验证案例(一)表结构DDL和Java Entity(二)Java代码三、结论总结前言 今天测试给提了个bug, 排查原因是插入数据时字段长度不

前言

今天测试给提了个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.0
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@38f502fc] was not reGIStered for synchronization because synchronization is not active
2022-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: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@38f502fc]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4fc3529] was not registered for synchronization because synchronization is not active
JDBC 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

参考资料

  • MySQL官网|String Type Storage Requirements
  • byte 和 KB 换算 参考

总结

到此这篇关于MySQL text能存多少个字符的文章就介绍到这了,更多相关MySQL text存多少字符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

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

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

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

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

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

下载Word文档
猜你喜欢
  • 一文详解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字符存储
  • MySQL text 能存多少个字符
    MySQL text 能存多少个字符 前言 今天测试给提了个bug, 排查原因是插入数据时字段长度不够导致。我使用的是MySQL8的数据库,在给某个表新增一条数据,其中一个字段submit_inf...
    99+
    2023-09-09
    mysql 数据库 sql
  • 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中一个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
  • 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 数据库
  • mysql一个表可以存多少条数据
    mysql表的存储容量取决于表结构、存储引擎和服务器配置。最大行数为922亿,最大表大小为64tb(非压缩)或32tb(压缩)。实际限制和性能考虑会影响实际容量。 MySQL表中可存储...
    99+
    2024-04-22
    mysql
  • css3如何设置一行显示多少个字符
    本篇内容主要讲解“css3如何设置一行显示多少个字符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3如何设置一行显示多少个字符”吧! ...
    99+
    2024-04-02
  • MySQL一张表能存的数据是多少
    这篇“MySQL一张表能存的数据是多少”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyS...
    99+
    2023-02-02
    mysql
  • GoJava算法之字符串中第一个唯一字符详解
    目录字符串中第一个唯一字符方法一:哈希表(Java)方法二:队列(Go)字符串中第一个唯一字符 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引...
    99+
    2024-04-02
  • 浅谈mysql一张表到底能存多少数据
    程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了...
    99+
    2024-04-02
  • 阿里云数据库MySQL一个月多少钱?详细解读
    随着云计算技术的飞速发展,越来越多的企业开始选择将业务迁移到云上。其中,阿里云数据库MySQL作为一种高性能、高可用、高可靠的数据库解决方案,已经赢得了众多企业的青睐。那么,阿里云数据库MySQL一个月多少钱呢?本文将详细解读这个问题。 阿...
    99+
    2023-12-10
    一个月 阿里 多少钱
  • 计算机网络中在ascii码文件中一个英文字母占多少个字节
    这篇文章主要介绍了计算机网络中在ascii码文件中一个英文字母占多少个字节,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在ascii码文件中一个英文字母占一个字节,一个中文汉...
    99+
    2023-06-25
  • 面试提问mysql一张表到底能存多少数据
    目录前言1、知识准备1.1、数据页1.2、索引结构(innodb)2、具体计算方法2.1、根节点计算2.2、其余层节点计算3、总结前言 程序员平时和mysql打交道一定不少,可以说每...
    99+
    2024-04-02
  • Java之一文详解String字符串的用法
    目录一. String字符串简介1. 概述2. 与字符的区别3. 定义方式3.1 构造方法定义3.2 直接赋值定义二. 字符串实用方法1. 字符串的比较方法2. 判断字符串是否为空3...
    99+
    2023-05-19
    Java String字符串用法 Java String字符串 Java String
  • seo优化中网站文章一般要多少个字左右
    这篇文章主要为大家展示了“seo优化中网站文章一般要多少个字左右”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“seo优化中网站文章一般要多少个字左右”这篇文章吧。  为什么最少要超过200字呢 ...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作