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 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
mysql多表查询-笔记七
Apr 05 MySQL
Mysql Show Profile
Apr 05 MySQL
MySQL kill不掉线程的原因
May 07 MySQL
为什么mysql字段要使用NOT NULL
May 13 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySQL数据库表约束讲解
Jun 21 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
BBS(php & mysql)完整版(八)
2006/10/09 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
《老山界》教学反思
2014/04/08 职场文书
检讨书大全
2015/01/27 职场文书
个人委托函范文
2015/01/29 职场文书
幼师自荐信范文
2015/03/06 职场文书
2015年社区工作总结
2015/04/08 职场文书
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
MySQL创建管理KEY分区
2022/04/13 MySQL