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时,则最多存 <math xmlns="http://www.w3.org/1998/Math/MathML"> 65532 / 3 = 21844 65532/3=21844 </math>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的区别

相关推荐
ROCKY_8172 小时前
Mysql复习(二)
数据库·mysql·oracle
问道飞鱼5 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
HaiFan.5 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
水根LP495 小时前
linux系统上SQLPLUS的重“大”发现
数据库·oracle
2401_882727575 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
途途途途6 小时前
精选9个自动化任务的Python脚本精选
数据库·python·自动化
追逐时光者6 小时前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio
04Koi.6 小时前
Redis--常用数据结构和编码方式
数据库·redis·缓存
silver98866 小时前
mongodb和Cassandra
数据库
PersistJiao6 小时前
3.基于 Temporal 的 Couchbase 动态 SQL 执行场景
数据库·sql