你真的了解mysql的varchar字段的长度有多少吗?
今天在设计系统字段的时候, 发现自己对varchar还不够了解.我设了一个字段.类型为VARCHER,然后我就往里面测试性了写了东西.发现没有多少就满了.我觉得奇怪,5.5版本以上的MYSQL不是有65535的长度吗,为什么只有这么一点点?后来才发现,原来VARCHER的默认长度还是255,如果你想它更长,就得指定.还有,你不能指定它为65535,或是65534,这样是会错的.原因如下:
1、限制规则
字段的限制在字段定义的时候有以下规则:
a) 存储限制
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。
b) 编码长度限制
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
c) 行长度限制
导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
2、计算例子
举两个例说明一下实际长度的计算。
a) 若一个表只有一个varchar类型,如定义为
create table t4(c varchar(N)) charset=gbk;
则此处N的最大值为(65535-1-2)/2= 32766。
减1的原因是实际行存储从第二个字节开始’;
减2的原因是varchar头部的2个字节表示长度;
除2的原因是字符编码是gbk。
b) 若一个表定义为
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
则此处N的最大值为 (65535-1-2-4-30*3)/3=21812
减1和减2与上例相同;
减4的原因是int类型的c占4个字节;
减30*3的原因是char(30)占用90个字节,编码是utf8。
如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。
你真的了解mysql的varchar字段的长度有多少吗?的更多相关文章
- MySQL VARCHAR字段最大长度到底是多少
MySQL VARCHAR字段最大长度到底是多少 varchar(n),n表示什么? MySQL5.0.3之前varchar(n)这里的n表示字节数 MySQL5.0.3之后varchar(n)这 ...
- 一个有趣的问题——MySQL中varchar的最大长度
明明维护了一个1k的最小堆,可是输出到MySQL里却只有九百多行数据. 查log,发现这么一段内容: stderr logs com.mysql.jdbc.MysqlDataTruncation: D ...
- mysql alter修改字段的长度 类型sql语句
在mysql中alter命令可以修改字段类型,长度,名称或一些其它的参数,下面我来给大家介绍alter函数修改字段长度与类型的两个命令,希望文章来给各位带来帮助. mysql 修改字段长度 a ...
- 修改MySQL表varchar字段的小实验
将actor表的first_name的varchar(45) ,修改为varchar(60) [root@vhost1 ~]# mysql -uroot -p -S /mysqldata/tmp/my ...
- mysql的varchar字段可以存储多少个中文字符
创建数据库,并创建一张表mytb进行测试 ******************************************************************************* ...
- MySQL数据库修改字段的长度
数据库版本:5.7.22 使用DDL语句:alter table 表名 modify 字段名 字符类型(长度) 例如: alter table db2.admin modify password );
- MySQL整数类型字段的长度总结
MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4)). 该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.(类似使用LPAD函数效果) 在INT( ...
- Mysql中varchar和char区别
一.varchar和char的区别: 区别一:定长和变长 char表示定长.长度固定,varchanr表示变长,即长度可变. 即char类型是规定多少字长则必须存储多少字长,超过的长度的字段则只能截取 ...
- mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value
一.问题描述 在往数据库写入数据的时候,报错: '字段名' doesn't have a default value 本来这个错误是经常见到的,无非就是字段没有设置默认值造成的.奇怪的是,我这边报错的 ...
随机推荐
- CSDN-Code平台使用过程中的5点经验教训
昨天又创建了一个项目,fucms,可是本地一直没有权限提交,搞了非常久,试了几十次,都不行,我是非常的灰心和郁闷. 刚刚,和CSDN-Code的官方客服咨询了非常久非常久,最终摸索出来了一些心得体会 ...
- android 打包 /${zipalign}" error=2, No such file or directory
当我更新完android L proview之后我的打包出问题了,报错/${zipalign}" error=2, No such file or directory 排查了一下午才知道 近 ...
- Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)
解题报告 二分图第一题. 题目描写叙述: 为了參加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; ...
- Java中怎么控制线程訪问资源的数量
在API中是这样来描写叙述Semaphore 的 Semaphore 通经常使用于限制能够訪问某些资源(物理或逻辑的)的线程数目. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可 ...
- Vertica数据库操作
删除主键(Vertica数据库的主键值并非唯一的): SELECT ANALYZE_CONSTRAINTS('fb_s.c_log'); 找到key名,再: ALTER TABLE fb_s.c_lo ...
- ASP.NET - List<> 绑定 DropDownList
代码: //声明泛型 List<category> inof = new List<category>();//二级分类 //声明类使用的对象类 public class ca ...
- 查看内存数据的函数(ByteToHex和ByteToBin,最终都变成String)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- SQLServer行转列
近期面试遇到了一道面试题.顿时有点迷糊,仅仅说出了思路.后来百度了一下.整理了一下思路,于是记录下来,方便以后学习.(面试题请參见附件) 相关的数据表: 1.Score表 2.[User]表 SQL语 ...
- BCB/Delphi中常用的VCL函数说明(字符串函数)
本文档是ccrun(老妖)根据网上资料整理而成. --------------------内存分配--------------------函数名称:AllocMem函数说明:在队中分配指定字节的内存块 ...
- Linux I/O 重定向详解及应用实例
Linux I/O 重定向详解及应用实例 简解 > 输出 < 输入 >> 追加 & [> | < | >>]之前:输入输出; ls /dev & ...