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执行计划
May 31 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
Mysql排序的特性详情
Nov 01 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
Mysql使用全文索引(FullText index)的实例代码
Apr 03 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
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
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
Java基础类库面试题
2013/09/04 面试题
上课迟到检讨书300字
2014/10/15 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
新生开学寄语大全
2015/05/28 职场文书
党章学习心得体会2016
2016/01/14 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python