一、varchar和char的区别:

区别一:定长和变长

char表示定长、长度固定,varchanr表示变长,即长度可变。

  • 即char类型是规定多少字长则必须存储多少字长,超过的长度的字段则只能截取出对应的长度进行存储,相对于要求字长长度不够的字段则用空格补齐。
  • 而varchar类型则是只要在规定字长之内,有多少存多少,无需补齐;超出的部分和char一样,舍去即可。(由perfix来实现)

区别二:存储容量不同

  • 对于char类型来说,最多只能存放的字符个数为255,和编码无关。
  • varchar最多能存放65532个字符。VARCHAR的最大有效长度由最大行大小和使用的字符集来确定。整体最大长度是65,532字节。

二、 在Mysql中用来判断是否需要进行对据列类型转换的规则

  1. 在一个数据列表里,如果每个数据列的长度都是固定的,那么每个数据列的宽度也是固定的。
  2. 只要数据列表里有一个数据列的长度可变,那么个数据列的长度都是可变的。
  3. 如果某个数据表里的某个数据行的长度是可变的,那么为了节约时间,Mysql会把这个数据库里的固定长度类型转换为可变长度类型。但是长度小于4的char类型不会转换为varchar类型。

三、 Mysql中varchar的最大长度为多少?(这不是一个固定的数字)

1. 限制规则

  • 存储限制

    • varchar字段是将实际内容存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535字符。
  • 编码长度限制
    • 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
    • 字符类型若为UTF8,每个字符最多占3字节,最大长度不能超过21845;
    • 若定义的时候超过上述限制,则varchar会被强制转换为text类型,并产生warning。
  • 行长度限制
    • 导致实际运用中varchar长度限制的是一个行定义的长度。Mysql要求一个行的定义长度不能超过65535bytes,若定义的表长度超过这个值,则提示:

      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

    • 由字符集来确定,字符集分单字节和多字节

      Latin1 一个字符占一个字节,最多能存放 65532 个字符

      GBK 一个字符占两个字节, 最多能存 32766 个字符

      UTF8 一个字符占三个字节, 最多能存 21844 个字符

      注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。

2. 计算例子

    • 若一个表只有一个varchar类型。其定义为

        create table t4(c varchar(N)) charset=gbk; 则此处N的最大值为(65535-1-2)/2=32766个字符。
      • 减1的原因是实际行存储从第二个字节开始;
      • 减2的原因是varchar头部的两个字节表示长度;
      • 除2的原因是字符编码是gbk

      若一个表定义为

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;则此处的最大值为(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”了。
    • 则此处N的最大值为(65535-1-2-4-30*3)/3=21812

      create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

最新文章

  1. appium +python 一个简单的例子
  2. 第22/24周 等待和I/O延迟统计
  3. 根据第三方提供的wsdl报文(axis2开发),进行的webservice应用的开发实例
  4. 一个不错的shell 脚本教程 入门级
  5. POJ 1066 Treasure Hunt --几何,线段相交
  6. Scala语法笔记
  7. ecshop 在首页每个商品下显示已销售数量
  8. http协议学习(一)http状态
  9. 通用权限底层研究:Web应用限制IP访问的功能实现
  10. Kaleidoscope for mac
  11. C++小技巧之四舍五入与保留小数
  12. 【leetcode列】3Sum
  13. 《Python编程从入门到实践》_第五章_if语句
  14. 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶
  15. 学习Tensorflow,反卷积
  16. java.lang.IllegalArgumentException异常 返回值类型的问题
  17. 选中FeatureLayer元素并高亮显示
  18. windows服务器基本管理及服务搭建
  19. maven clean或package报错
  20. Android ScrollView内部组件设置android:layout_height="fill_parent"无效的解决办法

热门文章

  1. git 专题
  2. wpf-MVVM界面自适应:界面自适应及字体自适应
  3. How to manipulate pixels on a bitmap by scanline property(Ma Xiaoguang and Ma Xiaoming)
  4. ML:多变量代价函数和梯度下降(Linear Regression with Multiple Variables)
  5. Linux日志系统
  6. Kafka笔记5
  7. Spring特点
  8. kubernetes实战篇之windows添加自签ca证书信任
  9. ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程
  10. 在 Windows 中编译 Github 中的 GO 项目