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类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。 它们的存储方式和数据的检索方式也都不一样。 数据的检索效率是:char > varchar ...
2、varchar(N)到底能存多长的数据在mysql reference manual上,varchar最多能存储65535个字节的数据。varchar 的最大长度受限于最大行长度(max row size,65535bytes)。65535并不是一个很精确的上限,可以继续缩小...
2.避免使用不兼容的数据类型:如float和int,char和varchar等都是不兼容的。 3.尽量避免在where子句中对字段进行函数或表达式操作。 4.避免使用is not null、in等一些无法让系统使用索引操作的词。 5.合理使用exists...
2.避免使用不兼容的数据类型:如float和int,char和varchar等都是不兼容的。 3.尽量避免在where子句中对字段进行函数或表达式操作。 4.避免使用is not null、in等一些无法让系统使用索引操作的词。 5.合理使用exists...
三、字段类型的选择 数据类型⼀⽅⾯影响数据存储空间的开销,另⼀⽅⾯也会影响数据查询性能。 当⼀个列可以选择多种数据类型时,应该优先选择数据类型,其次是⽇期或⼆进制类型,最后是字符类型。 对于相同级别的...
4. 数据类型 char 与 varchar2 有什么区别?性能方面各有什么优势? 5. 你怎么知道查询 SQL 的性能高还是低? 6. 在开发过程中遇到过数据库锁吗?怎样解锁? 7. 怎样处理并发数据? (重点) 8. delete from table ...
TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?如何使用 Unix shell 登录 Mysql?myisamchk 是用来做什么的?MYSQL 数据库服务器性能分析的方法命令有哪些?如何控制 HEAP 表的最大尺寸?MyISAM Static ...
" "据) " " 2) 数据类型长度的选用参考: 如果以下字段类型和长度能满足设计要求,必须遵循以下字段选用原则 "数据类型 "常用类型 " "CHAR "CHAR(1)本规范不推荐长度不为1的字" " "段使用char类型 " "VARCHAR2(N) ...
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的区别?...
like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。 9、DB Server 和APPLication Server ...
最近一周接连处理了2个由于int向varchar转换无法使用索引,从而引发的慢查询。 CREATE TABLE `appstat_day_prototype_201305` ( `day_key` date NOT NULL DEFAULT '1900-01-01', `appkey` varchar(20) NOT NULL ...
3、对于不可变字符类型char和可变字符类型varchar都是8000字节,char查询快,但是耗存储空间,varchar查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择...
引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些... 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,
" ") " " " "联系电话 "varchar(50)"允许为空 " " 表1-3 航线信息表 "列名 "数据类型 "可否为空 "说明 " "航线编号 "int(10) "not null "主键 " "起飞地 "char(10) "null " " "目的地 "char(10) "null " " "起飞时间...
物理设计 5.1销售人员信息表 "字段名称 "数据库字段名 "数据类型 "是否为主键 "备注 " "销售人员ID "SalemanID "Char(10) "是 "销售人员的编 " " " " " "号 " "姓名 "Salename "varchar(50) "否 "姓名 " "密码 ...
前言 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. 选择正确的列类型
3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 4、问了innodb的事务与日志的实现 5、MySQL binlog的几种日志录入格式以及区别 6、MySQL数据库cpu飙升到500%的话他怎么处理? 7、sql优化各种方法 8...
数据库优化 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 ...
数据库优化 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 ...