• varchar(n),n表示什么?

MySQL5.0.3之前varchar(n)这里的n表示字节数,n的最大值是65332

MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个,但存储空间不变,所以n的最大值比65332小得多

mysql一般用varchar存储文本类型,长度定义为varchar(n),那么n的最大值是多少呢?

结论

如果编码是utf-8,n 最大为21844=65532/3(个字符),如果编码是gbk,n 最大为32766=65532/2(个字符)

n的值不是越大越好,因为一条记录中varchar字段存储字符数量之和是21844,太大会影响后面的(varchar)字段,如果是大本文,请用text或blob,

  • 如果需要存储超长文本,考虑使用 text 类型,只存储指针长度

他们能存64kb-4GB,但在该条记录中只占5-9字节,(1kb=1024字节)

分析过程

MySQL要求一个行定义长度不能超过 65535 bytes(64kb)(所有字符串类型字段包括其字段名称占用空间都计算在内, text、blob等大字段类型除外)

众所周知,一条记录就是一行数据,比如说某个表有n个varchar类型的字段,那么这n个字段存储空间之和不能超过65535字节

但是 varchar 保存时用一个字节或两个字节长的前缀+数据。如果 varchar 列声明的长度大于 255,长度前缀是两个字节,所以 varchar 的最大长度应为:

65532=65535-1-2(字节)
utf-8 下为 21844=65532/3(个字符)

测试环境:MySQL版本 5.7.19

//首先要设置下 mysql 为严格执行模式,不然 varchar 超出最大长度为自动转为 text 类型
set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

运行sql

建表sql

CREATE TABLE test11(va VARCHAR(21844)
)DEFAULT CHARSET=utf8;

varchar(n)+text ,此时n最大值是?

每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

BLOB 和 TEXT 类型需要 1、2、3 或者 4 个字节来记录列值的长度,取决于该类型的最大可能的长度。

那么就是至少需要 10 字节(9+1)的空间了,再试一下:

[SQL]
CREATE TABLE test1(va VARCHAR(21840),tx text
)DEFAULT CHARSET=utf8;
Query OK, 0 rows affected

这里看到,当 va 字段腾出 12 字节的空间时,表可以创建成功

如果遇到了大文本,考虑使用 text,最大能到 4G。效率来说基本是 char>varchar>text,但是如果使用的是 Innodb 引擎的话,推荐使用 varchar 代替 char。char 和 varchar 可以有默认值,text 不能指定默认值

MySQL大文本存储类型

可以使用TEXT,BLOB俩种类型来存储长文本。

1. TEXT

TEXT有4有类型:

TINYTEXT 256bytes

TEXT 64kb

MEDIUMTEXT 16Mb

LONGTEXT 4GB

2. BLOB

TINYBLOB

BLOB、

MEDIUMBLOB

LONGBLOB

blob 保存的是二进制数据,利用这个特性,可以把图片存储到数据库里面。text只能存储文本。

长使用的是text的,因为blob存储的是二进制格式,所以长文本里面的搜有数据都是二进制数据,在上传图文的时候,传过来是String,保存起来,读取都需要转换,还有javaBean设计的时候也要把文本的类型弄成BLOB类型,在加上hibernate 4 ,生成blob对象还要LobHelper,各种麻烦,于是就使用text来存储。

作者:孟琬晶1528424003
链接:https://www.jianshu.com/p/fe9977be793e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为什么mysql的varchar字符长度会被经常性的设置成255

很多时候我们设置varchar(255)都习以为常了,甚至我还遇到过有人以为varchar不能设置超过255的人。其实varchar没有明确最大长度,然后有人说那65535字节(bytes)不是吗?

但是事实上如果你用的 utf8 编码的话按理最大可以设置到 varchar(21845),但是其实一般都会说你超出。其实MySQL要求一个行定义长度不能超过 65535 bytes(所有字符串类型字段包括其字段名称占用空间都计算在内, text、blob等大字段类型除外)。

如下图我先设置了个21842成功了,后面加个长度为3的varchar都会报错,所有如果一个表有很多varchar字段的时候,不应该把varchar设置的特别大,会影响后面的字段

言归正传那为什么我们会经常性设置成varchar(255)呢?

首先我们要知道一个概念:InnoDB存储引擎的表索引的前缀长度最长是767字节(bytes)

你如果需要建索引,就不能超过 767 bytes;utf8编码时 255*3=765bytes ,恰恰是能建索引情况下的最大值。

如果像lavavel5.3往后 使用的是utf8mb4编码,默认字符长度则应该是 767除以4向下取整,也就是191。

总结:varchar(255) 不是最优的字符长度,最优还是应该根据实际需要的来。但是这是一个保证你能少出错的一个很好的默认值
————————————————
版权声明:本文为CSDN博主「一江黑白」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/w790634493/article/details/80650611

一个比较详细的文章:MySQL字段类型

mysql 文本类型 深度解析相关推荐

  1. MySQL文本类型 存储大小,及各种数据类型在Java中用什么接收

    MySQL文本类型 基础类型: char (M个字节,0 <=M<= 255) varchar (L+1个字节,其中L<=M 且 0 <=M<= 65535) text ...

  2. 【MySQL】mysql文本类型, 长文本

    text类型 tinytext : 可存储256字节文本数据,适合超短文本 text : 可存储64kb文本数据,适合短文本 mediumtext : 可存储16MB文本数据, 适合长文本 longt ...

  3. MySQL 5.7 深度解析: 半同步复制技术

    复制架构衍生史 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史. MySQL的复制分为四种: 普通的replication,异步同步. 搭建简单,使用非常广泛,从mysql诞生之初,就产生了 ...

  4. android nfc标签类型,Android NFC标签 开发深度解析 触碰的艺术

    原标题:Android NFC标签 开发深度解析 触碰的艺术 本文来自于CSDN博客,作者:郭朝,已获授权,版权归原作者所有,未经作者同意,请勿转载. 欢迎同有博客好文章的作者加微信(ID:tm_fo ...

  5. Android NFC标签 开发深度解析 触碰的艺术

    这篇博客是在鸿洋的微信公众号看到的感觉收益非浅.于是转存于自己博客上以后可查阅. 本文由郭朝投稿. 郭朝的博客地址: http://blog.csdn.net/smartbetter 有几天没有更新博 ...

  6. MySQL字段类型解析

    前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...

  7. 深度解析串行并发并行,开发人员需彻底搞懂丨mysql|redis|skynet|协程|索引|读写分离|分布式锁|主从同步

    深度解析串行并发并行,开发人员需彻底搞懂 视频讲解如下,点击观看: 深度解析串行并发并行,开发人员需彻底搞懂丨mysql|redis|skynet|协程|索引|读写分离|分布式锁|主从同步丨C/C++ ...

  8. 深度解析 Sun为何一掷千金拿下MySQL?

    标题:深度解析 Sun为何一掷千金拿下MySQL? 作者:IT168 东方蜘蛛 链接:http://tech.it168.com/j/2008-01-21/200801211529940.shtml ...

  9. clob类型类似MySQL_Oracle中大文本数据类型Clob 长文本类型 (MySQL中不支持,使用的是text)Blob 二进制类型MySQL数据库Text...

    Oracle中大文本数据类型 Clob 长文本类型 (MySQL中不支持,使用的是text) Blob 二进制类型 MySQL数据库 Text 长文本类型 TINYTEXT: 256 bytes TE ...

最新文章

  1. Java 线程池的介绍以及工作原理
  2. 插件编写傻瓜教程VC6.0
  3. uva 12563——Jin Ge Jin Qu hao
  4. 异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁
  5. (pytorch-深度学习系列)pytorch避免过拟合-dropout丢弃法的实现-学习笔记
  6. 查询hive表_大数据中Hive与HBase的区别与联系
  7. JAVA引用类型在变量槽,浅析Java的内存模型
  8. dedecms漏洞getshell EXP最新可用
  9. Java笔记:Statement和PreparedStatement的区别
  10. “超级买手”阿里:一年投资65笔,涉及金额高达5400亿
  11. AD9361开发:接收与发送滤波器配置
  12. 数据建模讲解和案例分析
  13. 过采样oversampling为什么能够提高信噪比SNR呢?
  14. linux下的锐捷客户端
  15. Spark入门基础教程
  16. 2020 中南大学研究生招生夏令营机试题(1252~1256)
  17. 写在19年初的后端社招面试经历(两年经验): 蚂蚁 头条 PingCAP
  18. 稳健收益,缺你不可—A股优秀的基金和基金经理
  19. 中控门禁控制器接玻璃移动门
  20. 奥利给!!字体/颜色对话框这么豪横的解释,赶紧PICK一下吧!!

热门文章

  1. Solidworks部分报错及解决方法
  2. STM32驱动PCF8563,使用模拟IIC
  3. 植树节|晓一叶之理,种一树美好
  4. 奖项公布|Sui Demo Day香港站获胜者名单新鲜出炉
  5. 升级主机后网站显示服务器过期,虚拟主机常见问题解答
  6. Kotlin学习安卓篇(一)为什么要学习Kotlin?
  7. 数字图像处理与python实现-带通滤波器
  8. 【引用】DMA内存申请--dma_alloc_coherent
  9. android测量图片工具,ImageMeter Pro(图像测距)
  10. 【C++容器】数组和vector、array三者区别和联系