MySQL长文本字段的选取

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

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

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

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

go 复制代码
package main

import "fmt"

func main() {

	var str string

	for i := 1; i <= 255; i++ {
		str += "a"
	}

	fmt.Println(str)

	fmt.Println(len(str))

}
go 复制代码
输出为:
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 = 21844 65532/3=21844 65532/3=21844个字符数,

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

sql 复制代码
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。

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

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

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

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

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

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

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

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

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


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

参考 & 强烈推荐阅读

MySQL中varchar最大长度是多少?

MySQL性能优化之char、varchar、text的区别

相关推荐
颜进强几秒前
Claude Code - 18 从 Figma 到 React:一套让 AI 生成代码"不瞎编"的实战工作流
前端·后端·ai编程
wuqingshun3141598 分钟前
MYSQL中如果发生死锁应该如何解决?
数据库·mysql
DO_Community30 分钟前
Weaviate 托管数据库现已在 DigitalOcean 上开放公测
数据库·人工智能·开源·向量数据库·weaviate
报错小能手35 分钟前
索引常见面试题
数据库
Database_Cool_1 小时前
时序数据库选型:阿里云 Lindorm 时序引擎 vs InfluxDB 全维度对比
数据库·阿里云·时序数据库
geovindu1 小时前
CSharp: Bridge Pattern
开发语言·后端·桥接模式·结构型模式
霸道流氓气质1 小时前
SpringBoot中设计模式组合使用示例-策略、模板、观察者、门面、工厂、单例。
spring boot·后端·设计模式
其实防守也摸鱼1 小时前
渗透--损坏的对象级别鉴权漏洞(Broken Object Level Authorization, BOLA)
大数据·网络·数据库·学习·tcp/ip·安全·安全威胁分析
货拉拉技术1 小时前
复杂业务规则太多?我们搭了一个规则可视化配置平台
后端
hehelm1 小时前
IO 多路复用 — Reactor
linux·服务器·网络·数据库·c++