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中你可能忽略的COLLATION实例详解
May 12 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
mysql全面解析json/数组
Jul 07 MySQL
mysql查看表结构的三种方法总结
Jul 07 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实现对站点内容外部链接的过滤方法
2014/09/10 PHP
PHP中Array相关函数简介
2016/07/03 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
繁简字转换功能
2006/07/19 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
javascript每日必学之继承
2016/02/23 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
使用npy转image图像并保存的实例
2020/07/01 Python
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
电气自动化大学生求职信
2013/10/16 职场文书
策划助理岗位职责
2013/11/18 职场文书
学历公证委托书
2014/04/09 职场文书
企业文化演讲稿
2014/05/20 职场文书
党支部活动策划方案
2014/08/18 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android