`

选择优化的数据类型 (三)CHAR与VARCHAR

阅读更多

VARCHAR和CHAR

(这里假设使用的是InnoDB或MyISAM)

 

VARCHAR:

它能比固定长度的类型占用的更少的存储空间,因为它只占用了自己需要的空间(也就是说较短的值占用的空间就较少)。例外情况是使用ROW_FORMAT=FIXED创建MyISAM表,它为每行使用固定长度的空间,可能会造成浪费。

 

varchar使用额外1到2个字节来存储值长度。如果列的的最大长度小于或等于255时,则使用1字节,否则则使用2字节。

 

varchar能节约空间,所以对性能有帮助。然而由于行的长度是可变的,它们在更新的时候可能会发生变化 ,这会引起额外的工作。如果行的长度增加并不适合于原始的位置时,具体的行为则会和存储引擎相关。例如,MySIAM会把行拆开,InnoDb则可以会分页。另外的存储引擎还可能不会在合适的位置更新数据。

当最大长度远大于平均长度,并且很少发生更新的时候,通常适合使用varchar。还有当你使用复杂的字符集时,如UTF-8,它的每个字符都可能占用不同的存储空间。

 

在5.0及以上版本,无论是保存还是取值,mysql都会保留字符串末尾的空格。但是在4.1及之前的版本,这些空格会被去掉。

 

CHAR:

char是固定长度的,当保存char值的时候,mysql会去掉任何末尾的空格。进行比较的时候,空格会被填充到字符串末尾。

 

char适合存储用户密码的MD5哈希值,它的长度总是一样的。对于经常改变的值,char也好于varchar,因为固定长度的行不容易产生碎片,对于很短的列,char的效率也高于varchar。char(1)字符串对于单字节字符集只会占用一个字节,但是varchar(1)则会占用2个字节,因为1个字节用来存储长度信息。


char和varchar的兄弟类型是binary和varbinary,它们用于保存二进制字符串。二进制字符串和传统的字符很类似,但是它们保存的是字节,而不是字符,填充也有所不同。mysql用\0(0 字符)填充binary值,而不是空格,并且不会在获取数据的时候把填充的值去掉。(如果不想在取值的时候,值发生改变,就不要使用binary,因为mysql会用\0把它填充到需要的长度)。


varchar(5)和varchar(200)保存'hello'所占用的空间是一样的,那么使用较短的列有什么优势吗?

其实在巨大的优势,较大的列会使用更多的内存,因为mysql通常会分配固定大小的内存块来保存值。这对排序或使用基于内存的临时表尤其不好,同样的事情也会发生在使用文件排序或基于磁盘的临时表的时候。

 

最好的策略就是只分配需要的空间.

分享到:
评论

相关推荐

    MySQL中字段类型char、varchar和text的区别

    在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。 它们的存储方式和数据的检索方式也都不一样。 数据的检索效率是:char > varchar ...

    MySQL数据类型varchar详解

    2、varchar(N)到底能存多长的数据在mysql reference manual上,varchar最多能存储65535个字节的数据。varchar 的最大长度受限于最大行长度(max row size,65535bytes)。65535并不是一个很精确的上限,可以继续缩小...

    数据库-性能优化篇-1(1).docx

    2.避免使用不兼容的数据类型:如float和int,char和varchar等都是不兼容的。 3.尽量避免在where子句中对字段进行函数或表达式操作。 4.避免使用is not null、in等一些无法让系统使用索引操作的词。 5.合理使用exists...

    数据库_性能优化篇-2(1).docx

    2.避免使用不兼容的数据类型:如float和int,char和varchar等都是不兼容的。 3.尽量避免在where子句中对字段进行函数或表达式操作。 4.避免使用is not null、in等一些无法让系统使用索引操作的词。 5.合理使用exists...

    数据库物理设计.pdf

    三、字段类型的选择 数据类型⼀⽅⾯影响数据存储空间的开销,另⼀⽅⾯也会影响数据查询性能。 当⼀个列可以选择多种数据类型时,应该优先选择数据类型,其次是⽇期或⼆进制类型,最后是字符类型。 对于相同级别的...

    Java开发工程师面试题资料

    4. 数据类型 char 与 varchar2 有什么区别?性能方面各有什么优势? 5. 你怎么知道查询 SQL 的性能高还是低? 6. 在开发过程中遇到过数据库锁吗?怎样解锁? 7. 怎样处理并发数据? (重点) 8. delete from table ...

    SQL优化面试专题.pdf

    TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?如何使用 Unix shell 登录 Mysql?myisamchk 是用来做什么的?MYSQL 数据库服务器性能分析的方法命令有哪些?如何控制 HEAP 表的最大尺寸?MyISAM Static ...

    数据库设计规范(3).doc

    " "据) " " 2) 数据类型长度的选用参考: 如果以下字段类型和长度能满足设计要求,必须遵循以下字段选用原则 "数据类型 "常用类型 " "CHAR "CHAR(1)本规范不推荐长度不为1的字" " "段使用char类型 " "VARCHAR2(N) ...

    MySQL中的数据类型binary和varbinary详解

    BINARY和VARBINARY与 CHAR和VARCHAR类型有点类似,不同的是BINARY和VARBINARY存储的是二进制的字符串,而非字符型字符串。也就是说,BINARY和VARBINARY没有字符集的概念,对其排序和比较都是按照二进制值进行对比。 ...

    数据库常见面试题

    3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义? 4、date,datetime和timestamp数据类型有什么区别? 5、union 与union all的区别? 6、简述Mysql几种Join的区别? 7、drop,delete与truncate的区别?...

    SQL Server数据库查询速度慢原因及优化方法

    like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。 9、DB Server 和APPLication Server ...

    MySQL数据库中把int转化varchar引发的慢查询

    最近一周接连处理了2个由于int向varchar转换无法使用索引,从而引发的慢查询。 CREATE TABLE `appstat_day_prototype_201305` ( `day_key` date NOT NULL DEFAULT '1900-01-01', `appkey` varchar(20) NOT NULL ...

    Mysql高并发优化

    3、对于不可变字符类型char和可变字符类型varchar都是8000字节,char查询快,但是耗存储空间,varchar查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择...

    详解MySQL数据库优化的八种方式(经典必看)

    引言:  关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些... 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,

    航空订票管理系统-数据库课程设计.doc

    " ") " " " "联系电话 "varchar(50)"允许为空 " " 表1-3 航线信息表 "列名 "数据类型 "可否为空 "说明 " "航线编号 "int(10) "not null "主键 " "起飞地 "char(10) "null " " "目的地 "char(10) "null " " "起飞时间...

    进销存的数据库设计文档.doc

    物理设计 5.1销售人员信息表 "字段名称 "数据库字段名 "数据类型 "是否为主键 "备注 " "销售人员ID "SalemanID "Char(10) "是 "销售人员的编 " " " " " "号 " "姓名 "Salename "varchar(50) "否 "姓名 " "密码 ...

    MySql 5.1 参考手册.chm

    前言 1. 一般信息 1.1. 关于本手册 ...11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型

    MySQL面试题28道面试题

    3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 4、问了innodb的事务与日志的实现 5、MySQL binlog的几种日志录入格式以及区别 6、MySQL数据库cpu飙升到500%的话他怎么处理? 7、sql优化各种方法 8...

    MYSQL培训经典教程(共两部分) 2/2

    数据库优化 177 8.1 索引的使用 178 8.1.1索引对单个表查询的影响 ...数据类型的问题 184 8.2.1 有助于效率的类型选择 184 8.2.2 有关BLOB和TEXT类型 185 8.2.3 使用ANALYSE过程检查表列 186 8.2.3 ...

    MYSQL培训经典教程(共两部分) 1/2

    数据库优化 177 8.1 索引的使用 178 8.1.1索引对单个表查询的影响 ...数据类型的问题 184 8.2.1 有助于效率的类型选择 184 8.2.2 有关BLOB和TEXT类型 185 8.2.3 使用ANALYSE过程检查表列 186 8.2.3 ...

Global site tag (gtag.js) - Google Analytics