Mysql——》varchar

  • 一、varchar介绍
  • 1、长度
  • (1)为什么 varchar 最大字节长度是 65535 个字节?
  • (2)varchar 用几个字节存放长度?
  • (3)varchar用几个字节标识字段是否为空
  • (4)varchar最大字节长度?最大字符长度?
  • 2、存储空间
  • 3、特性
  • 4、应用场景
  • 5、不同版本的规定
  • 二、varchar最大字符长度的测试
  • 1、场景
  • 2、计算
  • 3、测试
  • (1)n=21589.33,创建表成功
  • (2)n=21589.34,创建表成功
  • (3)n=21589,创建表成功
  • (4)n=21590,创建表失败


一、varchar介绍

1、长度

可变,最大字符长度由最大行大小和使用的字符集确定。

(1)为什么 varchar 最大字节长度是 65535 个字节?

Q:为什么 varchar 最大字节长度是 65535 个字节?
A:因为mysql 规定了每行数据(不包括隐藏列和记录头信息)大小不能超过 65535 个字节。

(2)varchar 用几个字节存放长度?

Q:varchar 用几个字节存放长度?
A:
小于255字节:用1个字节存放长度
大于255字节:用2个字节存放长度

(3)varchar用几个字节标识字段是否为空

Q:varchar用几个字节标识字段是否为空?
A:用1个字节

(4)varchar最大字节长度?最大字符长度?

Q:varchar最大字节长度?最大字符长度?
A:
最大字节长度 = 行最大字节数(65535) - null 标识字节数 - 长度前缀字节数(1或2)
最大字符长度 = 最大字节长度 / 单字符占用最多字节数


最大字节长度:

  • 65535:规定的最大长度
  • 65533:不允许空字段的时候
  • 65532:允许空字段的时候

2、存储空间

1. 真实数据
2. 真实数据占用字节的长度
3. NULL值标识(如果该列有NOT NULL属性则可以没有这部分存储空间)

3、特性

1. 使用最小的符合需求的长度
2. varchar(n) n<=255使用额外一个字节保存长度,n>255使用额外两个字节保存长度
3. varchar(5)与varchar(255)保存同样的内容,硬盘存储空间相同,但内存空间占用不同,是指定的大小 
4. varchar在mysql5.6之前变更长度,或者从255一下变更到255以上时时,都会导致锁表
5. 每次更新后都会重算并使用额外存储空间保存长度
6. 根据实际内容长度保存数据

4、应用场景

  1. 文章内容
  2. 特殊字符
  3. 不经常更新的字符串

5、不同版本的规定

版本

varchar(n)

varchar(20)

长度范围(字节)

最大长度(字节)

MySQL 5.0.3 之前

n:字节数

最多存储20个字节

utf-8编码:只能放6个汉字

0-255

255

MySQL 5.0.3 之后

n:字符数

最多存储20个字符

跟编码无关

0-65535

65535:规定的最大长度

65533:不允许非空字段的时候

65532:允许非空字段的时候

二、varchar最大字符长度的测试

最大字节长度 = 行最大字节数(65535) - null 标识字节数 - 长度前缀字节数(1或2)
最大字符长度 = 最大字节长度 / 单字符占用最多字节数

1、场景

创建表:test
字符集:UTF8
字段:name,非空, char(255)
字段:address,非空,varchar(n),n是咱们即将见证的最大字符长度

2、计算

每行数据的最大字节数:**65535 **
char(255)最大字节数:255*3(一个字符最多占 3 个字节)
varchar(n)存放长度字节数:2(超过255字节用2个字节存放长度)
字段为非空:0(如果字段允许null,则需要1个字节存储null标识)

varchar(n)的最大字节数 = **65535 - **255*3 - 2 = 64768
varchar(n)的最大字符数 = 字节数/3
n = 64768/3 = 21589.33

3、测试

-- n=21589.33,创建表成功
create table test1 (name char(255) not null, address varchar(21589.33) not null );

-- n=21589.34,创建表成功
create table test2 (name char(255) not null, address varchar(21589.34) not null );

-- n=21589,创建表成功
create table test3 (name char(255) not null, address varchar(21589) not null );

-- n=21590,创建表失败
create table test4 (name char(255) not null, address varchar(21590) not null );

(1)n=21589.33,创建表成功

mysql数据库中varchar中有多个数据 mysql varchar sum_最大长度


mysql数据库中varchar中有多个数据 mysql varchar sum_mysql_02

(2)n=21589.34,创建表成功

mysql数据库中varchar中有多个数据 mysql varchar sum_最大长度_03

mysql数据库中varchar中有多个数据 mysql varchar sum_varchar_04

(3)n=21589,创建表成功

mysql数据库中varchar中有多个数据 mysql varchar sum_varchar_05


mysql数据库中varchar中有多个数据 mysql varchar sum_最大长度_06

(4)n=21590,创建表失败

mysql数据库中varchar中有多个数据 mysql varchar sum_mysql_07

1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs