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 相关文章推荐
52条SQL语句教你性能优化
May 25 MySQL
mysql中between的边界,范围说明
Jun 08 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
pt-archiver 主键自增
Apr 26 MySQL
mysqldump进行数据备份详解
Jul 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表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Python列表解析配合if else的方法
2018/06/23 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
3的组成教学反思
2014/04/30 职场文书
运动会口号16字
2014/06/07 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书