MySQL长文本字段的选取

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL长文本字段的选取

某个字段需要存储 长文本类型的数据,长度可变,范围不清.

varchar最多能存储多大长度呢? 何种情况下用text更好?

以下内容就为探究这个问题:

微信截图_20230926022726.png

<1>.先将content字段设为varchar(255),则此字段只能最多存储255个字符数

package main
import "fmt"
func main() {
  var str string
  for i := 1; i <= 255; i++ {
    str += "a"
  }
  fmt.Println(str)
  fmt.Println(len(str))
}
输出为:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
255

将生成的255位的str,写入content字段,成功保存. 且与文本是 数字,英文 还是中文,全角还是半角无关.(自MySQL 5.0之后)


但如果写入更长的数据,则会从第255位开始,之后的都舍弃.

baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (还是255位,舍弃最后一个a) 可以写入,

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac (256位),无法写入


<2>.varchar类型的上限是 最多能存储65535个字节的数据(而不是字符; 即64KB),因而其上限和字符集有关,如果是latin1,则可以表示65532长度的字符数 (变长字段额外使用1或2个字节来记录实际数据长度、以及是否为NULL标识位,如果数据表只有一个varchar字段且该字段DEFAULT NULL,那么该varchar字段的最大长度为65532个字节,即65535-2-1=65532 byte)

字符集为utf-8时,则最多存 65532/3=2184465532/3=2184465532/3=21844个字符数,

尝试将content自动改为varchar(21844),报错如下:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

微信截图_20230926022848.png

这是因为不仅受 存储限制,编码长度限制,还受到mysql单行长度限制,mysql一行记录所有长度不得超过65535。若定义的表中各字段长度超过这个值,则提示如上错误.

因为这张表还有一个int(11)类型的id,故而达不到21844这个长度.


将id字段删掉,只保留content这一个字段,在utf-8下,可成功设置为 varchar(21844),

如改为varchar(21845),则会继续报如上错误.

微信截图_20230926022903.png

<3>.如果继续以较大幅度提供后面的值,如 varchar(70000),则不会报错而将自动转为mediumtext类型.

微信截图_20230926022948.png

如将该字段字符集(及其相应的排序规则)改为latin1,则可成功设置为varchar(65532)

微信截图_20230926022959.png

如再提高至varchar(65533),则会报上面行大小太大的错误.

latin1字符集下,存储英文大小写,数字,都没有问题,但用来存储汉字,则会因为不能识别而被记录为?

微信截图_20230926023042.png

<4.>在在utf-8下, 且只有这一个字段,可成功设置为varchar(21844)情况下,经实际亲测,可以容纳21844个字符,超出部分将会被舍弃.

微信截图_20230926023055.png

微信截图_20230926023104.png

即一般情况下,如果长度小于2万,可用varchar,否则就要用text

微信截图_20230926023149.png


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
自然语言处理 关系型数据库 MySQL
如何在mysql数据库里进行文本的相似度排序?
【8月更文挑战第28天】如何在mysql数据库里进行文本的相似度排序?
355 62
|
9天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
32 8
|
19天前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
22 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
57 8
|
1月前
|
SQL 存储 关系型数据库
MySQL新增字段/索引会不会锁表?
MySQL新增字段/索引会不会锁表?
101 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 查询某个字段含有字母数字的值
MySQL 查询某个字段含有字母数字的值
62 0
|
1月前
|
存储 关系型数据库 MySQL
MySQL 字符字段长度设置详解:语法、注意事项和示例
MySQL 字符字段长度设置详解:语法、注意事项和示例
186 0
|
1月前
|
关系型数据库 MySQL 数据库管理
MySQL技术指南:如何更改数据字段的前几位数字
MySQL技术指南:如何更改数据字段的前几位数字
54 0
|
2月前
|
自然语言处理 关系型数据库 MySQL
match如何在mysql数据库里进行文本的相似度排序?
【9月更文挑战第1天】match如何在mysql数据库里进行文本的相似度排序?
110 1
|
2月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
171 0