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令人咋舌的隐式转换
Apr 05 MySQL
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL的join buffer原理
Apr 29 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
SQL注入详解及防范方法
Dec 06 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
关于MySQL中explain工具的使用
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
php 操作excel文件的方法小结
2009/12/31 PHP
php截取中文字符串函数实例
2015/02/23 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
input 高级限制级用法
2009/03/26 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
vue项目打包上传github并制作预览链接(pages)
2019/04/19 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
跟老齐学Python之开始真正编程
2014/09/12 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
用Python解决x的n次方问题
2019/02/08 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
Django在Model保存前记录日志实例
2020/05/14 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
python线程优先级队列知识点总结
2021/02/28 Python
英文求职信写作小建议
2014/02/16 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
Python如何将list中的string转换为int
2022/07/15 Ruby