MySQL中的char与varchar详解

mysql中char与varchar的区别

        char:定长,效率高,一般用于固定长度的表单提交数据存储 ;例如:身份证号,手机号,电话,密码等
        varchar:不定长,效率偏低

1、varchar类型的变化

        MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0255或1255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。
        MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字 节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。
        4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是 65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:

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、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语句中的字段,考虑加索引,整形的尤其适合加索引。

转载自:Lancer@Lancer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初步学习

C语言的变量必须在函数开始定义,而C可以边使用变定义C不支持重载,C函数支持重载,函数参数数量不同 或者 函数参数类型不同即可重载C的命名空间C语言不允许使用空的结构体(struct),C允许使用空的结构体(class)C面向过程&#xff0c…

排序算法(一)--桶排序、冒泡、快排(JAVA)

排序算法汇总 参考书籍–《啊哈!算法》 作者:啊哈磊 首先提出一个问题:班内有5名同学,成绩分别为5,8,2,4,2分(满分10分),需要将成绩从小到大排序…

apache启动错误 AH00072: make_sock: could not bind to address [::]:443

一、安装apche遇到问题 在电脑上win7系统中安装了wnmp(nginxMySQLphp7.2)后,想要在安装一套wamp(apacheMySQLphp7.2)。说做就做,wamp的安装就比较简单了:首先,直接下载apache的压缩包…

Page9:结构分解以及系统内部稳定和BIBO稳定概念及其性质[Linear System Theory]

内容包含系统能控性结构分解、系统能观测性结构分解以及系统结构规范分解原理,线性系统的内部稳定、BIBO稳定概念及其性质 转载于:https://www.cnblogs.com/ERFishing/p/10314720.html

Java集合类及常用数据结构

下面这个图示为JAVA的集合类关系图,没用用严格的UML,了解其中的关系即可,其中颜色强调的几个类为常用的集合类。

win7添加开机启动项

添加开机启动项 开始菜单->所有程序->有个“启动”目录,然后右击选择“打开”,之后把软件的快捷方式移动到此目录下,然后重启电脑,就可以了。 注意:如果修改了程序的安装目录,这里需要删除之前的快捷…

续PA协商过程

续PA协商过程 当sw3的接口恢复之后会发生2中情况。 ①sw3的G0/0/2口先发BPDU ②sw3的G0/0/3口先发BPDU sw3先发送BPDU sw3和sw1的交互过程: sw3的2口恢复后,sw3的所有接口(除了边缘端口),变为DP(discardi…

搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)

拯救同伴问题 问题描述:假设有如下迷宫,求解从某一点出发到目标位置的最短距离 Input: 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 Output: 7 深度优先搜索(DFS) import java.util.Scanner;public class DF…

PHP7.2的安装与配置(win7)

1、PHP的安装 1)、环境安装目录: C:/wamp/|——php|——php7.2|——Apache24|——mysql|——www2)、下载 linux专用:http://www.php.net/downloads.php windows专用:http://windows.php.net/download/ 官网里Windo…

常用类(二)

10.3 可变字符序列:字符串缓冲区 10.3.1 StringBuffer、StringBuilder、String的区别 1、一个类似于 String 的字符串缓冲区,但能被修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容&#…

搜索算法(二)--DFS/BFS求解炸弹人问题(JAVA )

炸弹人问题 问题描述:小人可以在迷宫中任意地方放置一个炸弹,炸弹可以在以该点为中心的十字方向杀死怪物,但是触碰到墙之后不再能传递攻击。求将一个炸弹放在哪个位置可以杀死更多的怪物?? Input: 13 1…

could not find driver和PDO drivers = no value

could not find driver 使用ThinkPHP5.0.20(win7apache2.4.41 php7.2.21MySQL5.7)连接MySQL数据库时,报错: 然后使用phpinfo();查看了一下扩展,发现了问题(PDO drivers 的值为 no value)&…

1090 Highest Price in Supply Chain (25 分)

1090 Highest Price in Supply Chain (25 分)A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone involved in moving a …

搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )

宝岛探险问题 问题描述:某片海域有诸多岛屿,用0表示海洋,1-9表示陆地,现给定一个岛屿上的坐标点,求解所在岛屿的面积 思路:显然这是一个搜索算法,即只要从当前坐标点开始遍历,每遍…

win7上修改MySQL数据库密码

一、通过命令行方式修改MySQL密码 1、方法一:用mysqladmin 格式:mysqladmin -u用户名 -p旧密码 password 新密码 实例:mysqladmin -uroot -pabc password 123456 2、方法二:用set password 首先,登录MySQL数据库。…

Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

原文地址https://www.cnblogs.com/zhaof/p/7306374.html 关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列。 这里重…

搜素算法(基础)--DFS/BFS算法(JAVA)

DFS、BFS的定义及C语言算法实现请参照 连通图遍历策略之深度优先搜索(C语言) 连通图遍历策略之广度优先搜索(C语言) 为了便于理解这里的数据是一个无向图,要求输出遍历顺序 下面只给出用例和算法,之后可…

TP中给select下拉框选中的内容搜索选中seleted

开发某个搜索功能时&#xff0c;在select下拉框选中条件后&#xff0c;单击搜索后总是重置下拉框条件&#xff0c;不能固定之前选中的条件。因此使用TP框架中的IF标签来实现。 代码如下&#xff1a; <select name"select_name" id"select_name"><…

python-入门

Python入门 阅读目录 一 编程与编程语言二 编程语言分类三 主流编程语言介绍四 python介绍五 安装python解释器六 第一个python程序七 变量八 用户与程序交互九 基本数据类型十 格式化输出十一 基本运算符十二 流程控制之if...else十三 流程控制之while循环十四 流程控制之for循…

图论算法(一)--最短路径的DFS/BFS解法(JAVA )

最短路径–城市路径问题&#xff1a; 问题描述&#xff1a;求从1号城市到5号城市的最短路径长度 Input&#xff1a; 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 4 3 4 4 4 5 5 5 3 3 Output&#xff1a; 9 DFS import java.util.Scanner; public class minPath {stati…