MySql中varchar和char,如何选择合适的数据类型?
背景
学过MySQL的同学都知道MySQL中varchar和char是两种最主要的字符串类型,varchar是变长的类型,而char是固定长度。那关于如何选择类型就成为令人头疼的事,很多初学者为了保证业务兼容性强,存储字符串类型一律都是varchar类型。这是不妥的,需要根据varchar和char的特性来进行选择。
varchar和char数据类型的区别
varchar类型用于存储可变长的字符串,是比较常见常用的字符串数据类型,在存储的字符串是变长时,varchar更加节约空间。由于varchar是变长的,在使用update的时候,可能使得行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增加,并且在页内没有多余的空间可与存储,这是innoDB的存储引擎需要分裂页来使行可以放进页内。
char类型是定长的。在存储数据时,MySQL会删除所有文末的空格,所以,即便你存储的是:'abc ',注意这个字符串末尾是有空格的,也会在存储时把这个空格删掉,这点需要注意。
适用的场景
varchar适用的场景:
- 字符串列的最大长度比平均长度要大很多;
- 字符串列的更新很少时,因为没有或很少有内存碎片问题;
- 使用了UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储;
char适用的场景:
- 列的长度为定值时适合适用,比如:MD5密文数据
varchar和char的优缺点
varchar的优点:
- 变长的字符串类型,兼容性更好
varchar的缺点:
- 使用varchar可能会产生内存碎片
- varchar会额外需要1到2个字节存储长度信息
- update语句可能会导致页分裂
char的优点:
- 定长的字符串类型,减少内存碎片
- 无需额外的内存空间去存储长度信息
char的缺点:
- 会删除列末尾的空格信息
参考:
《高性能MySQL第3版》第四章

MySql中varchar和char,如何选择合适的数据类型?的更多相关文章
- MySQL中varchar与char区别
MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字 ...
- Mysql中varchar和char区别
一.varchar和char的区别: 区别一:定长和变长 char表示定长.长度固定,varchanr表示变长,即长度可变. 即char类型是规定多少字长则必须存储多少字长,超过的长度的字段则只能截取 ...
- mysql 中Varchar 与char的区别
一.字符与字节与编码关系 ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制.最 ...
- mysql中varchar和char区别(思维导图整理)
由于mysql一直是我的弱项(其实各方面我都是很弱的),所以最近在看msyql,正好看到varchar和char区别,所以整理一下,便于以后遗忘. 0.0图片已经说明一切,但是系统说我字数不够,我真能 ...
- MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
varchar与char的区别: 1).varchar与char的区别char是一种固定长度的类型,varchar则是一种可变长度的类型 尽可能的使用 varchar 代替 char ,因为首先变长 ...
- MySQL中VARCHAR与CHAR格式数据的区别
区别 CHAR与VARCHAR类型类似,但它们保存和检索的方式不同.CHAR有固定的长度,而VARCHAR属于可变长的字符类型.它们最大长度和是否尾部空格被保留等方面也不同.在存储和检索过程中不进行大 ...
- 浅谈mysql中varchar(m)与char(n)的区别与联系
mysql建表长度的限制 在mysql建表时,出现以下报错信息: 错误一:行大小过大,所使用的表这种类型的最大的行大小,不算BLOB类型,是65535.(这是我翻译的) 原因是MySQL在建表的 ...
- MySQL中varchar类型在5.0.3后的变化
1.mysql varchar类型变化:mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 之 ...
- (1.1)mysql 选择合适的数据类型
(1.1)mysql 选择合适的数据类型 1.char与varchar [1.1]char 在内容未满定义长度时,做空格填充,且字符串末尾空格会被截断:超出定义长度也会被截断. 如:char(4) ...
随机推荐
- JS 浏览器BOM
BOM:Browser Object Model 浏览器对象模型 2.组成: window :窗口对象 1.创建: 2.方法: *与弹出框有关 1.alert(); 弹出警告框 2.confirm() ...
- 360 Atlas生产环境使用心得
一.Atlas介绍 Atlas是360开源的一个Mysql Proxy,以下是官方介绍: Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目 ...
- ribbon源码(1) 概述
ribbon的核心功能是提供客户端在进行网络请求时负载均衡的能力.主要有以下几个模块: 负载均衡器模块 负载均衡器模块提供了负载均衡能力,详细参见ribbon源码之负载均衡器. 配置模块 配置模块管理 ...
- TypeScript之父:JS不是竞争对手,曾在惧怕开源的微软文化中艰难求生
开源的 TypeScript 也曾在微软内部遭到抵制,但如今 TypeScript 已经成为 Web 应用构建的主流语言. 微软的开源编程语言 TypeScript 是 JavaScript 的一 ...
- Java多线程--AQS
ReentrantLock和AQS的关系 首先我们来看看,如果用java并发包下的ReentrantLock来加锁和释放锁,是个什么样的: 1 ReentrantLock reentrantLock ...
- get请求传递json格式数据的两种方法
get请求参数为json格式数据,使用pyhton+request的两种实现方式如下: 方法一:使用requests.request() 示例代码如下: 1.导入requests和json impor ...
- PHP判断是否是微信浏览器访问的方法
PHP判断是否是微信浏览器访问的方法 PHP判断是否是微信浏览器访问的方法 都是干货,微信开发可能需要用到,留着日后COPY. public function isWeichatBrowser() { ...
- Centos-挂载和卸载分区-mount
mount 挂载和卸载指定的分区 相关选项 -a 加载文件 /etc/fstab中指定的所有设备 -n 不降加载信息记录在 /etc/mtab文件中 -r 只读方式加载设备 -w 可读可写价值设备 ...
- Python-开发规范-遵循PEP8规范
Python中空白 1. 4个空格表示缩进,用4个空格代替一个TAB 2. 不再逗号.分号.冒号前加空格,应该在其后加空格 3. 关系运行符.数学运算符.逻辑运算符.赋值运算符 前后都加一个空格 4. ...
- CentOS7设置内网时间同步
1.yum 安装 NTP服务器 [root@master ~]# yum -y install ntp 2.启动ntpd服务 [root@master ~]# systemctl start ntpd ...