热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL数据库中CHAR与VARCHAR区别介绍

本文章详细介绍了关于MySQL数据库中CHAR与VARCHAR区别介绍,有需要了解的朋友可参考本文章。

本文章详细介绍了关于MySQL数据库中CHAR与VARCHAR区别介绍,有需要了解的朋友可参考本文章。

在mysql数据库系统中,char和varchar是非常常见的,它们两个也非常的相似,都是用来保存相对较短的字符串,如保存文章标题、留言、email、用户名等。

二者的主要区别在于存储方式:
char列长度是创建表时声明的长度而且固定不变,长度被限制在0到255之间。而varchar列中的值是可变长度字符串,长度也为0-255,在5.0.3之后长度延长到65535。

在查询显示数据的时候,char会删除字符串尾部的空格(仅仅是尾部),而varchar则完全保留这些空格。这样我们在显示char类型字符串时就没有必要trim掉尾部的空格了。

char适合与保存短字符内容,比如说是 "YS ", "AD ", "OK ", "NO ", "DL ",之类的标志控制符
用于检索方面的,但是前提是,必须是定长的字符才能够保证效率,
vchar适合保存容量较大的内容。不适合保存标志类信息,他的优势是节省存储空间。
为了提高效率吧vchar转传撑char没有什么意义

在MySQL中用来判断是否需要进行对据列类型转换的规则

1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.
3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.
例外:长度小于4个字符的char数据列不会被转换为varchar类型

性能测试


VARCHAR平均长度200,CHAR长度250,其它配置如下:
配置项
配置

记录数
1000万,2000万,5000万,1亿

存储引擎
Innodb

行格式
compact

测试过程中使用的表结构

代码如下

CREATE TABLE `mysqlchar` (
`username` char(32) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `mysqlchar` (
`username` varchar(32) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `mysqlchar` (
`username` char(32) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `mysqlchar` (
`username` varchar(32) default NULL
) ENGINE= InnoDB DEFAULT CHARSET

代码如下
function getRandom($length){
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890';
$result = '';
for($i=$length;$i>0;$i--){
$result .= $str{mt_rand(0,62)};
}
return $result;
}
function insert(){
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$password = 'xxxxx';
$dbh = new PDO($dsn, $user, $password);
$sth = $dbh->prepare('INSERT INTO mysqlchar(`username`)
VALUES(?)');
echo microtime();
echo ' ';
for($i=0;$i<20;$i++){
$sth->execute(array(getRandom(mt_rand(6,32))));
}
echo microtime();
}
function select(){
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$password = 'xxxxxx';
$dbh = new PDO($dsn, $user, $password);
$sth = $dbh->prepare('SELECT username from mysqlchar
WHERE username = ?');
echo microtime();
echo ' ';
$sth->execute(array('BOklEnL2onF'));
echo microtime();
}
function addKey(){
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$password = 'xxxxx';
$dbh = new PDO($dsn, $user, $password);
echo microtime();
echo ' ';
$dbh->query('ALTER TABLE mysqlchar ADD KEY test(`username`)');
echo microtime();
}
//insert();
//select();
//addKey();
?>


测试结果(单位:秒)

MyISAM InnoDB
选项 CHAR(32) VARCHAR(32) 选项 CHAR(32) VARCHAR(32)
1、插入200W数据时间(PHP命令行下执行) 443.34701 422.386431 1、插入1W数据时间(PHP命令行下执行) 227.850326 215.932341
2、插入20条数据(三次平均) 0.004720 0.004445 2、插入20条数据(三次平均) 0.381118 0.405421
3、查询1条数据(三次平均) 0.858885 0.827146 3、查询1条数据(三次平均) 0.017053 0.011800
4、建立索引 30.322559 24.306851 4、建立索引 0.502228 0.455406
6、插入20条数据(三次平均) 0.006587 0.006420 6、插入20条数据(三次平均) 0.359265 0.418550
7、查询1条数据(三次平均) 0.005637 0.002780 7、查询1条数据(三次平均) 0.000867 0.000679
结果说明 在MyISAM引擎下,VARCHAR(32)在各方面的性能都比CHAR(32)较好。
在InnoDB引擎下,除了插入数据VARCHAR(32)的性能略输CHAR(32)外,在查询方面的性能均比CHAR(32)好。

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 关羽败走麦城时路过马超封地 马超为何没有出手救人
    对当年关羽败走麦城,恰好路过马超的封地,为啥马超不救他?很感兴趣的小伙伴们,趣历史小编带来详细的文章供大家参考。说到英雄好汉,便要提到一本名著了,没错,那就是《三国演义》。书中虽 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 夏侯惇在曹魏集团的地位及其重要性
    本文介绍了夏侯惇在曹魏集团中的地位及其重要性。夏侯惇虽然没有特别显赫的战绩,但是他是曹操最信任的军事将领。通过对夏侯惇生平经历的回顾,可以看出他在曹魏集团的重要地位。从曹魏集团的二号人物到裨将、司马等职位的担任,夏侯惇一直是曹操最亲信的人之一。夏侯惇的历史地位在曹魏集团中不可忽视。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
author-avatar
被爱的李义9_556
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有