首页 > 数据库 >mysql的varchar最大能存储多少个字符?

mysql的varchar最大能存储多少个字符?

时间:2022-12-05 15:11:47浏览次数:36  
标签:存储 varchar 字节 长度 mysql 65535 个字符

mysql中varchar能够存储可变长度的字符串。过去我做的诸多业务中,一般存储短字符串的需求,都会使用varchar类型,并且定义长度为255,也就是varchar(255)。

不过为了探究varchar这种类型到底是怎么存储的,它的最大长度能达到多少,我决定区翻一下mysql文档学习一下。

varchar怎么存储

经过一番了解,varchar最大能存储的长度为65535字节。存储字符串的时候,会将字符串的长度存在首部,接着才是内容。

当varchar存储的字符个数小于或等于255的时候,首部需要一个字节来记录字符的个数。当内容大于255的字符的时候,首部需要2个自己来保存长度。

varchar能存的最大字符长度

理论上,varchar能够存储65535个字节,但是由于首部会占用两个字节,因此这会让varchar可用的存储空间变成了65533字节。如果定义的列是非空话,那最大是65533,如果定义的列允许NULL,那么null会占用一个额外的字节,因此最大只能存储65532个字节。

字节并不等于字符长度,varchar括号里面跟着的是字符长度,如果字符集是utf8的话,每一个字符统一会占用3个字节的长度,不管是汉子还是英文字符,因此最大能够存储的长度是65533/3 = 21844。如果字符集是utf8mb4那最大存储长度就更小了,为65533/4=16383。

试验验证UTF8下的最大长度

连接mysql,输入status,看到环境中mysql版本是5.6.34。

先创建一个测试的数据库

mysql> create database imhuchao default charset utf8;
Query OK, 1 row affected (0.00 sec)

创建一个含有varchar列的表,试试65535.

mysql> create table test(v1 varchar(65535) not null);
ERROR 1074 (42000): Column length too big for column 'v1' (max = 21845); use BLOB or TEXT instead

很显然,这样会出错。提示我们最大为21845,这个只是简单的用65535/3计算了一下,这是不准确的。我们用21845的话,很明显这还是错误的。

mysql> create table test(v1 varchar(21845) not null);
ERROR 1118 (42000): 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

mysql的行大小最大为65535,很明显21845*3+2已经超过了这个大小。因此如果是utf8字符集,varchar能存的字符个数最多只有21844

mysql> create table test(v1 varchar(21844) not null);
Query OK, 0 rows affected (0.01 sec)

试验验证latin1下的最大长度

定义一个非空列,看看最大长度

mysql> create table test2(v1 varchar(65533) not null) default charset latin1;
Query OK, 0 rows affected (0.02 sec)

很明显,65533是可以达到的。

如果允许空的话,那将会出错

mysql> create table test3(v1 varchar(65533)) default charset latin1;
ERROR 1118 (42000): 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

允许空值,最大只能到65532

mysql> create table test3(v1 varchar(65532)) default charset latin1;
Query OK, 0 rows affected (0.01 sec)

======

mysql每行最大只能存65535个字节。假设是utf-8编码,每个字符占3个字节。varchar存储最大字符数为(65535-2-1)/3=21844。

验证:

新建表只有一个字段name。最大只能为21844=65532/3个字符。存21845会报错。

 

 再新建一个字段设置最小为1。报错:

 

 行最大表示已被占用,无法继续创建字段。

 

标签:存储,varchar,字节,长度,mysql,65535,个字符
From: https://www.cnblogs.com/super-chao/p/16952324.html

相关文章

  • mysql8 添加用户,赋予表操作权限
    1.mysql8修改了安全规则,不能像mysql5.7一次性创建用户并授权,需要分批创建1.创建用户createuser'username'@'host'identifiedby'password'创建用户说明:1.use......
  • CodeSmith部署安装以及编写MySQL模板的时候无法获取description
    最近需要使用VS2015开发新项目,由于考虑到后期的扩展性,打算使用EF的codefirst模式来编写,但是前期又设计好了数据库结构,不想大动干戈的去重新写代码,网上搜索了说用“EntityF......
  • MySQL字符串转换数字
    mysql将字符串转为数字的方法:1、利用“+”运算符,语法“'字符串'+0”;SELECTJSON_EXTRACT(charge_sts,'$.waiter')k1,JSON_EXTRACT(charge_sts,'$.waiter')+0k2,'01......
  • MySQL锁,锁的到底是什么?
    MySQL锁,锁的到底是什么? MySQL锁系列文章已经鸽了挺久了,最近赶紧挤了挤时间,和大家聊一聊MySQL的锁。只要学计算机,「锁」永远是一个绕不过的话题。MySQL锁也是一样。......
  • xp下安装ror+mysql最新心得
    话说不少前辈也说了,ROR最好在LINUX上跑,这个道理是知道的,但对于不用ROR开发的偶,单单扫下盲的话,就打算用WINDOW上算了,不过还是感受到在XP上装ROR......
  • MySQL命令
    1连接mysql命令:mysql-uroot-p2查看存储引擎:showengines;3显示database:showdatabases;4连接database:usedb01;5显示表信息:showcreatetablepayment;6直......
  • MySQL优化详解
    1.MySQL简介MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle公司。Mysql是开源的,可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系......
  • Go-MySQL
     通过sql.open拿到DB对象dsn:=fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&multiStatements=true",    m.Username,m.Password,m.Host,m.Port,m.DB......
  • mysql中的unixtime归纳
    1什么是Unix时间戳(Unixtimestamp)?Unix时间戳(Unixtimestamp),或称Unix时间(Unixtime)、POSIX时间(POSIXtime),是一种时间表示方式,定义为从格林威......
  • MySQL的or/in/union与索引优化
    假设订单业务表结构为:order(oid,date,uid,status,money,time,…)其中:oid,订单ID,主键date,下单日期,有普通索引,管理后台经常按照date查询uid,用户ID,有普通索引,用户查......