1.mysql varchar类型变化:

mysql 5.0.3 之前:

0--255字节

varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字。

MySQL 5.0.3 之后:

0--65535字节

varchar(20)表示字符数,不管什么编码,既汉字也能放20个。但最多占65532字节(两个字节存放长度,小于255字节用1个字节存放长度)

1.存储限制:

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65532。

2.字符编码的长度限制:

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

3.行长度限制:

导致实际应用中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。

**************************

通过navicat测试得出,

当字段为utf8编码时,最大长度设置21845,但会出现警告ERROR 1118 (42000): Row size too large...,改为略小于21845的数值可以。

修改为gbk,最大长度设置32766,但会出现警告ERROR 1118 (42000): Row size too large...,改为略小于32766的数值可以。

***************************

2.CHAR(M), VARCHAR(M)不同之处

CHAR(M):

列的长度为固定的,M取值可以为0~255之间

当保存CHAR值时,在它们的右边填充空格以达到指定的长度。

当检 索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M):

列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集确定。整体最大长度是65,532字节)。

VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则 使用两个字节)。

VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。

varchar存储变长数据,但存储效率没有 CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录 字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉 的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

3. VARCHAR和TEXT、BlOB类型的区别

VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型 的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4而存储要求是5个字节。

BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要(不用指定长度)。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。

BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于 4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对 TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

4.总结char,varchar,text区别

长度的区别,char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的 column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般 情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G。

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char

char和varchar可以有默认值,text不能指定默认值

数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。这里在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。

mysql5.0varchar_MySQL中varchar类型在5.0.3后的变化相关推荐

  1. MySQL中varchar类型在5.0.3后的变化

    1.mysql varchar类型变化: mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 ...

  2. mysql varchar 中英文_MySQL5.1中varchar类型中文和英文长度的问题

    今天,也是突发奇想,在MySQL上验证varchar(15)会存15个中文,超过的会自动截取前15个. 一直抱守旧的观念(这种观念可能来源与s 今天,也是突发奇想,在MySQL上验证varchar(1 ...

  3. 数据库中varchar类型 最大长度是多少?

    一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)  5.0版本以上,varchar(20),指的是20字符, ...

  4. Mysql中varchar类型的猫腻!

    varchar的存储规则 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节). 5.0版本以上,varchar(20),指的是20字符,无论存 ...

  5. numeric转换varchar_数据库中varchar类型数据转换为numeric类型

    关于数据库中varchar/nvarchar类型数据的获取注意事项 当在页面后台获取数据库表中某字段的数据时,需注意该数据的类型.防止因实际数据的字符长度因达不到指定数据类型规定的字符长度而导致空格的 ...

  6. MySQL中varchar类型字段隐式转换造成多删除数据

    例如一个表中字段是varchar类型: desc test; +-------+-------------+------+-----+---------+----------------+ | Fie ...

  7. 数据库中varchar类型长度是指字符长度还是字节长度?两种定义方法

    Oracle中varchar2类型的字段长度单位默认是按照byte来定义, 比如常见写法varchar2(10)  代表只接收最大10字节长度 这种定义情况下10字节只能插入3个汉字,(数字字母只占一 ...

  8. MySql中varchar类型长度的含义、Java中String长度的含义

    varchar(5)表示的是字符长度5,不是字节数

  9. mysql的char在java中表示为_Java学习篇之-Mysql中varchar门类总结_mysql

    java学习篇之---mysql中varchar类型总结 Mysql中varchar类型总结 今天新做一个项目,需要自己进行数据库设计,发现自己对varchar的用法还不是很熟悉,所以查阅资料总结若下 ...

最新文章

  1. ALD和CVD晶体管薄膜技术
  2. Red Hat Enterprise Linux 5安装图解
  3. Java入门(一):Hello World !
  4. Spring Schema整合Quartz_01
  5. 解决xx is not in the sudoers file. This incident will be reported.问题
  6. HandlerThread使用
  7. java 多列 统计_java – 如何计算多列(colspan)HTML表的宽度?
  8. Linux计划任务入门详解
  9. 19.Virtual Type
  10. python文本词频统计是字典吗,只使用字典python3计算.txt文件中的词频
  11. python filter 求100以内素数
  12. 【GIS】开源GIS简介
  13. 计算机网络 王道考研2021 第六章:应用层 -- 域名系统 DNS、域名解析
  14. 苹果账号开启双重认证,以及如何在移动设备上同时添加私人账号和开发者账号
  15. 桌面虚拟化-精彩刚刚开始
  16. 大数据技术之Hadoop(HDFS)第2章 HFDS的Shell操作
  17. 后摩尔时代来临,语音IC封装技术一触即发
  18. MySQL 数据库下载(windows)
  19. SQLSTATE[HY000] [1049] Unknown database
  20. 信息与计算机科学专业毕业论文,《信息与计算机科学毕业论文》.doc

热门文章

  1. 使用ldirectord实现后端RS健康状态监测及LVS调度功能
  2. 10个最好的 jQuery 视频插件(转)
  3. 自定义服务器控件(扩展现有 Web 控件)
  4. 清除webBrowser 缓存和Cookie的解决方案
  5. intellij idea 部署项目的时候 图中application context 写不写有什么关系?有什么作用?...
  6. Oracle 把游标说透
  7. 慎用url重写(转)
  8. 我为什么从 Google 辞职?
  9. 解决IDEA2020控制台乱码的方法(亲测)
  10. django2.2+pymysql0.9.3报错(亲测)