Mysql——》varchar

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】

一、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-255255
MySQL 5.0.3 之后n:字符数最多存储20个字符
跟编码无关
0-6553565535:规定的最大长度
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,创建表成功

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
建立一个博客系统需要以下步骤: 1. 确定需求,设计数据库表结构。 2. 搭建开发环境,安装 PHP 和 MySQL。 3. 编写代码,实现用户管理、博客管理、评论管理等功能。 4. 将代码部署到服务器上,配置好权限和安全设置。 以下是一个简单的博客系统的数据库表设计: 1. 用户表(users) |字段名|类型|说明| |----|----|----| |id|int|用户ID,自增主键| |username|varchar(50)|用户名| |password|varchar(50)|密码| |email|varchar(50)|邮箱| |avatar|varchar(100)|头像| 2. 博客表(blogs) |字段名|类型|说明| |----|----|----| |id|int|博客ID,自增主键| |title|varchar(100)|博客标题| |content|text|博客内容| |create_time|datetime|创建时间| |update_time|datetime|更新时间| |user_id|int|用户ID,外键| 3. 评论表(comments) |字段名|类型|说明| |----|----|----| |id|int|评论ID,自增主键| |content|text|评论内容| |create_time|datetime|创建时间| |user_id|int|用户ID,外键| |blog_id|int|博客ID,外键| 在 PHP 中,可以使用 mysqli 或 PDO 扩展来操作 MySQL 数据库。具体实现可以参考以下步骤: 1. 连接数据库: ```php $conn = new mysqli($servername, $username, $password, $dbname); ``` 2. 执行 SQL 语句,例如插入一条博客记录: ```php $title = "Hello World"; $content = "This is my first blog."; $user_id = 1; $sql = "INSERT INTO blogs (title, content, user_id) VALUES ('$title', '$content', $user_id)"; $conn->query($sql); ``` 3. 查询数据,例如查询所有博客: ```php $sql = "SELECT * FROM blogs"; $result = $conn->query($sql); while ($row = $result->fetch_assoc()) { echo $row["title"] . "<br>"; } ``` 4. 更新数据,例如更新一条博客记录: ```php $id = 1; $title = "Hello World 2"; $content = "This is my second blog."; $sql = "UPDATE blogs SET title='$title', content='$content' WHERE id=$id"; $conn->query($sql); ``` 5. 删除数据,例如删除一条博客记录: ```php $id = 1; $sql = "DELETE FROM blogs WHERE id=$id"; $conn->query($sql); ``` 以上是一个简单的博客系统的实现方法,但在实际开发中还需要考虑安全性、性能等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值