MySQL中VARCHAR与CHAR格式数据的区别


Posted in MySQL onMay 26, 2021

区别

CHAR与VARCHAR类型类似,但它们保存和检索的方式不同。CHAR有固定的长度,而VARCHAR属于可变长的字符类型。它们最大长度和是否尾部空格被保留等方面也不同。在存储和检索过程中不进行大小写转换。

下面的表格显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:

值 CHAR(4) 存储需求 VARCHAR(4) 存储需求
'' ' ' 4个字节 '' 1个字节
'ab' 'ab ' 4个字节 'ab' 3个字节
'abcd' 'abcd' 4个字节 'abcd' 5个字节
'abcdefgh' 'abcd' 4个字节 'abcd' 5个字节

从上面可以看得出来CHAR的长度是固定的,不管你存储的数据是多少他都会都固定的长度。而VARCHAR则处可变长度但他要在总长度上加1字节,这个用来存储字符长度(如果声明的长度超过255,则使用2个字节)。所以实际应用中用户可以根据自己的数据类型来做。

请注意,上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度的值不被保存,并且会出现错误。

从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。通过下面的例子说明差别:

mysql> CREATE TABLE test(a VARCHAR(4), b CHAR(4));

mysql> INSERT INTO test VALUES ('ab ', 'ab ');

mysql> SELECT CONCAT(a, '+'), CONCAT(b, '+') FROM test;

结果如下:

CONCAT(a, '+') CONCAT(b, '+')
ab + ab+

从上面可以看出来,由于某种原因CHAR有固定长度,所以在处理速度上要比VARCHAR快很多,但是相对浪费存储空间,所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以用VARCHAR类型来实现。

建议

MyISAM存储引擎 建议使用固定长度,数据列代替可变长度的数据列
INNODB 存储引擎 建议使用VARCHAR类型

总结分析:

文字字段若长度固定,如:身分证号码,就不要用 varchar 或 nvarchar,应该用 char 或 nchar。
支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题
文字字段若长度不固定,如:地址,则该用 varchar 或 nvarchar。除了可节省存储空间外,存取硬盘时也会较有效率

MySQL 相关文章推荐
MySQL 角色(role)功能介绍
Apr 24 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
MySQL触发器的使用
May 24 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL 数据类型选择原则
May 27 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
修改MySQL的默认密码的四种小方法
May 26 #MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 #MySQL
Mysql数据库命令大全
May 26 #MySQL
Mysql基础知识点汇总
May 26 #MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 #MySQL
linux下导入、导出mysql数据库命令的实现方法
May 26 #MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
You might like
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
php表单提交实例讲解
2015/11/12 PHP
浅谈php处理后端&接口访问超时的解决方法
2016/10/29 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
node使用request请求的方法
2019/12/20 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
SVM基本概念及Python实现代码
2017/12/27 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
django框架ModelForm组件用法详解
2019/12/11 Python
python实现名片管理器的示例代码
2019/12/17 Python
python如何运行js语句
2020/09/09 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
什么时候需要进行强制类型转换
2016/09/03 面试题
体育运动口号
2014/06/09 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
javascript实现计算器功能详解流程
2021/11/01 Javascript
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python