Mysql中的varchar
两点声明:
- MySQL要求一个行的定义长度(所有字段长度的和)不能超过65535
- 单个字段如果大于65535,则需要转为转换为TEXT 类型存储。
- 单行最大限制为65535,这里不包括TEXT、BLOB。
- 数据库中 gbk编码一个字符占用2个字节,utf8编码一个字符占3个字节,utf8mb4编码一个字符占4个字节
详细描述:
示例1:
当创建 字符集类型为 utf8mb4、字段可以为 NULL 值、只有 1 个 varchar 字段 的表时:
SQL:
CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=utf8mb4;
错误:
[Err] 1074 - Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead
解析:
varchar字段数据最大长度
= 一行记录最大的数据大小(字节) / 字符集表示一个字符时的最大大小(字节)
= (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节) - NULL 值标识(1 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))
即:VARCHAR 字段类型最多能存储的数据长度 = (65535 - 2 - 1) / 4 = 16383 。
修改SQL:
CREATE TABLE t1 (name varchar(16383) NULL) CHARSET=utf8mb4;
示例2:
当创建 字符集类型为 utf8mb4、字段为not NULL 值、只有 1 个 varchar 字段 的表时:
SQL:
CREATE TABLE t2 (name varchar(65535) NOT NULL) CHARSET=utf8mb4;
错误:
[Err] 1074 - Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead
解析:
VARCHAR 字段类型最多能存储的数据长度 = (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))
VARCHAR 字段类型最多能存储的数据长度 = (65535 - 2 ) / 4 = 16383.25 ,约为 16383 。
修改SQL:
CREATE TABLE t2 (name varchar(16383) NOT NULL) CHARSET=utf8mb4;
示例3:
当创建 字符集类型为 utf8mb4、字段不可以为 NULL 值、只有 1 个 varchar 字段、加上 1 个 int 字段的表时,情况又不一样了。
SQL:
CREATE TABLE t3 (name varchar(16383) NULL, age int) CHARSET=utf8mb4;
错误:
[Err] 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
解析:
VARCHAR 字段类型最多能存储的数据长度
= 一行记录最大的数据大小(字节) / 字符集表示一个字符时的最大大小(字节)
= (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节) - NULL 值(1 字节)- int 类型的大小( 4 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))
即:VARCHAR 字段类型最多能存储的数据长度 = ( 65535 - 2 - 1 -4 ) / 4 = 16382 。
示例4:
如果我们更改编码类型为utf8 和 gbk看看报错信息
GBK:
CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=GBK; #[Err] 1074 - Column length too big for column 'name' (max = 32767); use BLOB or TEXT instead
字段长度 = (65535 - 2 - 1) / 2 = 32766
UTF8:
CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=utf8; #[Err] 1074 - Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
字段长度 = (65535 - 2 - 1) / 3 = 21844
上面虽然提示了最大长度分别为32767和21845但是真创建时候会报错的
[SQL]CREATE TABLE t3 (name varchar(32767) NULL) CHARSET=GBK; [Err] 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
修改SQL:
[SQL]CREATE TABLE t3 (name varchar(32766) NULL) CHARSET=GBK; 受影响的行: 0 时间: 0.006s
参考网站:跳转
原文地址:https://www.cnblogs.com/ryuma/p/15181704.html
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 微信小程序开发实战(28):播放、暂停、停止声音
- 微信小程序开发实战(29):控制背景音乐
- 面试:如何从 100 亿 URL 中找出相同的 URL?
- Spring Boot+Gradle+ MyBatisPlus3.x搭建企业级的后台分离框架
- 不要再对类别变量进行独热编码了
- 面试Java基础问题汇总
- K8s集群上使用Helm部署2.4.6版本Rancher集群
- 一个工作三年的同事,居然还搞不清深拷贝、浅拷贝...
- 太有意思了,教你实现实现王者荣耀团战!
- 动画:什么是基数排序?
- 一个有意思的分钱模拟问题
- 如何快速的开发一个完整的直播购物源码,基础篇
- 「拥抱开源」Nacos 实战篇
- 仅2M!免费软件又一次干掉了付费版
- python爬虫学习 爬取幽默笑话网站