美文网首页
mysql 中varchar的长度设定

mysql 中varchar的长度设定

作者: 内沐 | 来源:发表于2020-07-13 20:59 被阅读0次

最近在工作中遇到一个问题,项目中数据库的一个字段设定的长度要被用尽了,需要调整.这个字段是varchar类型的.于是直面而来的一个问题就是:varchar类型字段长度到底能设置为多大?


首先确定的一点是mysql中varchar(n) ,这个n代表的是字符数(不是字节数).

举个例子:

Table Create Table
user CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`name` varchar(5) NOT NULL,
`age` smallint(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into user values (111,'我是中国人',20);
1 row affected in 51 ms

增加一个字符

insert into user values (222,'我是中国人呢',20);
[22001][1406] Data truncation: Data too long for column 'name' at row 1

提示超长

insert into user values (222,'abcde',20);
 1 row affected in 61 ms

增加一个字符

insert into user values (333,'abcdef',20);
[22001][1406] Data truncation: Data too long for column 'name' at row 1

提示超长

可以看出 n 代表的是字符数

那这个n最大是多少呢?

计算公式为:

# 21840.6667 = 21840
select (65535 - 8 - 2 - 1 -2) / 3;

解析:
varchar的设定受到mysql对一行数据允许最大字节数的限制.
mysql要求一个行的定义长度不超过65535(2^16 - 1) 所以有65535
减8的原因是字段id的bigint类型占用8个字节.
减2的原因是varchar头部的2个字节表示长度(超过255为2,小于255为1).
减1的原因是实际行的存储从第2个字节开始.
减2的原因是字段age的smallInt类型占用2个字节.
除以3的原因是一个utf8字符通常占用3个字节.

验证:

alter table user modify name varchar(21841);
[42000][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

更换为21840

alter table user modify name varchar(21840);
 2 rows affected in 165 ms
Field Type Null Key Default Extra
id bigint(20) NO PRI NULL
name varchar(21840) YES NULL
age smallint(6) YES NULL

相关文章

  • mysql 中varchar的长度设定

    最近在工作中遇到一个问题,项目中数据库的一个字段设定的长度要被用尽了,需要调整.这个字段是varchar类型的.于...

  • 2020-08-06 数据蛙第十期题目mysql部分

    Mysql 基础 1、Mysql中字段char、varchar的区别 char:长度固定,char(10), 存入...

  • mysql日常使用

    大纲: 一. mysql 数据类型 注意点: char和varchar使用char长度不可变,varchar长度可...

  • Mysql char varchar text

    1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其...

  • mysql练习题3

    **问题:**MySQL中的varchar和char有什么区别? 有三种区别:长度,效率,存储 1.长度 char...

  • Mysql中varchar类型长度问题

    今天在设计一个简单,但是value值可能会很长的数据库表时;考虑到varchar类型长度问题。遇到了一个有意思的问...

  • MySQL 字符串数据类型

    MySQL 字符串数据类型 CHAR & VARCHAR 区别: CHAR 是一种长度固定的类型;VARCHAR ...

  • 数据蛙第九期就业班 2020/7/23

    MYSQL练习题 1、MySQL中的varchar和char有什么区别? 1、CHAR的长度是固定的,而VARCH...

  • Mysql varchar 长度问题

    今天看了实习生的建表语句,里面有很多字段都是varchar(255),觉得很奇怪便提了一句了,实习生:“因为mys...

  • 2020 -7-23

    mysql 练习题1、mysql中的varchar 和 char 有什么区别?二者存储长度不同,char 是不可变...

网友评论

      本文标题:mysql 中varchar的长度设定

      本文链接:https://www.haomeiwen.com/subject/czpzcktx.html