【译】MySQL char、varchar的区别
本文旨在涵盖两种数据类型的相似性和差异。两者几乎相同,但在某些方面,两略有不同。
介绍
CHAR和VARCHAR几乎相同,但在存储和从数据库中检索数据的阶段,两者都不同。 对于这两种数据类型,我们必须传递length说明符,它表示字段可以保存多少数据。例如char(30)和varchar(30),这意味着这些数据类型的字段最多可以容纳30个字符。 对于CHAR,此长度可以是从0到255之间的任何值,对于VARCHAR可以是从0到65,535。但对于VARCHAR,此最大限制取决于您使用的最大行大小和字符集。 数据存储 在这两种类型中,数据的存储是非常不同的。首先是CHAR的情况。
CHAR
当值存储在CHAR字段中时,剩余的字符将用空格填充。 例如,一个字段是“name CHAR(5)”,并且您要存储只是“jack”,则实际值将存储为“jack ”。
name CHAR (5 )
---------------------------------------
value actual_storage
---- -----------------------------------
'EX' '恩'
'EXPER' 'EXPER'
'专家' ' exper '
---------------------------------------
VARCHAR
与CHAR不同,VARCHAR只占用基于存储的数据的空间,因此,例如,如果我们有20个字节放入VARCHAR(30)的,那么这将占据基于数据大小的空间(20字节)。 VARCHAR的另一件事是,如果数据小于255个字符,则使用1个字节,对于大于255个字符的数据,则占用2个字节作为长度前缀
对于这两种数据类型,如果传递的数据大于指定的长度,MySQL将截断数据以适应创建表时指定的长度,并且将返回警告。但是,如果SQL Strict模式未启用,情况将是这样。 但是如果你想限制数据的截断,你应该在MySQL中启用严格模式。所以它会为查询生成错误。
name VARCHAR (5 )
---------------------------------------
value actual_storage
---- -----------------------------------
'EX' '恩'
'EXPER' 'EXPER'
'专家' ' exper '
---------------------------------------
数据检索
这两种类型的数据检索也非常不同。
CHAR
如上所述,如果提供的数据较少,CHAR将向数据中添加空格,因此在检索数据时,它将删除添加的空格并提供数据。
VARCHAR
只会存储您通过查询的数据,如CHAR,它不会对数据执行任何空间删除过程。
CHAR或VARCHAR?
所以现在的问题是,哪一个使用?使用这些数据类型完全取决于需要。
- 如果你有固定大小的数据,就像“Y”和“N”的标志。然后它将更好地使用CHAR而不是VARCHAR。原因是长度前缀与VARCHAR一起使用。 所以如果你使用VARCHAR,那么它将为“Y”和“N”存储2个字节。(即,1字节用于数据,1字节用于长度前缀),并且CHAR将仅存储仅为数据的1字节。
- 对于大型数据集,只使用固定大小的记录,因此只能使用CHAR类型。
为什么?想象一下,MySQL想要检索集合的第10个记录。 使用VARCHAR,它必须读取第一个记录的前缀以知道第二个开始的哪个字节,等等。 只有CHAR,MySQL知道每个记录是x字节长,因此第10个记录是在10 * x字节文件。 因此,使用大型事实表时,只使用CHAR类型是一个很好的做法。 它可以大大减少您的I / O。删除空格的时间与此相比显然可以忽略不计。
原文:http://www.xpertdeveloper.com/2011/12/char-varchar-in-mysql/
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Android实现通用筛选栏
- Android实现关机后数据不会丢失问题
- Canvas 进阶(五)实现图片滤镜效果
- 将IP地址字符串分割成数组
- android监听器实例代码
- (火狐)Selenium WebDriver测试 NotADirectoryError: [WinError 267] 目录名称无效。
- 浅析Android高斯模糊实现方案
- Android 自定义验证码输入框的实例代码(支持粘贴连续性)
- _countof和sizeof
- Flutter适配深色模式的方法(DarkMode)
- RecyclerView+SnapHelper实现无限循环筛选控件
- 详解Android 8.1.0 Service 中 弹出 Dialog的方法
- 短信收发类无错版JustinIO.cs
- Android快速实现无预览拍照功能
- RecyclerView+PagerSnapHelper实现抖音首页翻页的Viewpager效果