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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
MySQL官方导出工具mysqlpump的使用
May 21 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
SQL Server数据库的三种创建方法汇总
May 08 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
PHP4中实现动态代理
2006/10/09 PHP
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
js身份证验证超强脚本
2008/10/26 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
Python实现处理管道的方法
2015/06/04 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
一看就懂得Python的math模块
2018/10/21 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
python-numpy-指数分布实例详解
2019/12/07 Python
python中的django是做什么的
2020/07/31 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
解除劳动关系协议书2篇
2014/11/28 职场文书
2014年财政工作总结
2014/12/10 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
学雷锋活动简报
2015/07/20 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
java泛型通配符详解
2021/07/25 Java/Android
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python