mysql 文本类型 深度解析

  • varchar(n),n表示什么?

  •  

MySQL5.0.3之前varchar(n)这里的n表示字节数,n的最大值是65332

MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个,但存储空间不变,所以n的最大值比65332小得多

mysql一般用varchar存储文本类型,长度定义为varchar(n),那么n的最大值是多少呢?

结论

如果编码是utf-8,n 最大为21844=65532/3(个字符),如果编码是gbk,n 最大为32766=65532/2(个字符)

n的值不是越大越好,因为一条记录中varchar字段存储字符数量之和是21844,太大会影响后面的(varchar)字段,如果是大本文,请用text或blob,

  • 如果需要存储超长文本,考虑使用 text 类型,只存储指针长度

他们能存64kb-4GB,但在该条记录中只占5-9字节,(1kb=1024字节)

分析过程

MySQL要求一个行定义长度不能超过 65535 bytes(64kb)(所有字符串类型字段包括其字段名称占用空间都计算在内, text、blob等大字段类型除外)

众所周知,一条记录就是一行数据,比如说某个表有n个varchar类型的字段,那么这n个字段存储空间之和不能超过65535字节

但是 varchar 保存时用一个字节或两个字节长的前缀+数据。如果 varchar 列声明的长度大于 255,长度前缀是两个字节,所以 varchar 的最大长度应为:

65532=65535-1-2(字节)
utf-8 下为 21844=65532/3(个字符)

测试环境:MySQL版本 5.7.19

//首先要设置下 mysql 为严格执行模式,不然 varchar 超出最大长度为自动转为 text 类型
set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

运行sql 

建表sql

CREATE TABLE test11(
    va VARCHAR(21844)
)DEFAULT CHARSET=utf8;

varchar(n)+text ,此时n最大值是?

每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

BLOB 和 TEXT 类型需要 1、2、3 或者 4 个字节来记录列值的长度,取决于该类型的最大可能的长度。

那么就是至少需要 10 字节(9+1)的空间了,再试一下:

[SQL]
CREATE TABLE test1(
    va VARCHAR(21840),
    tx text
)DEFAULT CHARSET=utf8;
Query OK, 0 rows affected

这里看到,当 va 字段腾出 12 字节的空间时,表可以创建成功

 

如果遇到了大文本,考虑使用 text,最大能到 4G。效率来说基本是 char>varchar>text,但是如果使用的是 Innodb 引擎的话,推荐使用 varchar 代替 char。char 和 varchar 可以有默认值,text 不能指定默认值

 

MySQL大文本存储类型

 

可以使用TEXT,BLOB俩种类型来存储长文本。

1. TEXT

 

TEXT有4有类型:

TINYTEXT 256bytes

TEXT 64kb

MEDIUMTEXT 16Mb

LONGTEXT 4GB

2. BLOB

 

TINYBLOB

BLOB、

MEDIUMBLOB

LONGBLOB

blob 保存的是二进制数据,利用这个特性,可以把图片存储到数据库里面。text只能存储文本。

长使用的是text的,因为blob存储的是二进制格式,所以长文本里面的搜有数据都是二进制数据,在上传图文的时候,传过来是String,保存起来,读取都需要转换,还有javaBean设计的时候也要把文本的类型弄成BLOB类型,在加上hibernate 4 ,生成blob对象还要LobHelper,各种麻烦,于是就使用text来存储。



作者:孟琬晶1528424003
链接:https://www.jianshu.com/p/fe9977be793e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

为什么mysql的varchar字符长度会被经常性的设置成255

很多时候我们设置varchar(255)都习以为常了,甚至我还遇到过有人以为varchar不能设置超过255的人。其实varchar没有明确最大长度,然后有人说那65535字节(bytes)不是吗?

但是事实上如果你用的 utf8 编码的话按理最大可以设置到 varchar(21845),但是其实一般都会说你超出。其实MySQL要求一个行定义长度不能超过 65535 bytes(所有字符串类型字段包括其字段名称占用空间都计算在内, text、blob等大字段类型除外)。

如下图我先设置了个21842成功了,后面加个长度为3的varchar都会报错,所有如果一个表有很多varchar字段的时候,不应该把varchar设置的特别大,会影响后面的字段


言归正传那为什么我们会经常性设置成varchar(255)呢?

首先我们要知道一个概念:InnoDB存储引擎的表索引的前缀长度最长是767字节(bytes)

你如果需要建索引,就不能超过 767 bytes;utf8编码时 255*3=765bytes ,恰恰是能建索引情况下的最大值。

如果像lavavel5.3往后 使用的是utf8mb4编码,默认字符长度则应该是 767除以4向下取整,也就是191。

总结:varchar(255) 不是最优的字符长度,最优还是应该根据实际需要的来。但是这是一个保证你能少出错的一个很好的默认值
————————————————
版权声明:本文为CSDN博主「一江黑白」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/w790634493/article/details/80650611


一个比较详细的文章:MySQL字段类型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章