2010-07-01 416 views
33

我知道CHAR和VARCHAR之间的differnce,为什么我应该为MySQL中的varchar选择其他长度超过255的?

CHAR - 固定长度

VARCHAR - 可变长度(大小+ 1个字节)

但我想知道究竟是什么purpse有一个varchar长度的选项,例如VARCHAR(50)VARCHAR(100)VARCHAR(255)

这对我来说似乎毫无意义,因为实际使用的空间取决于存储在数据库中的值。

所以我的问题是:

1)它是精细设置我所有的VARCHAR的255 2)你为什么要指定任何其他lenght?从MySQL documentation

+1

的可能重复[是否有缺点使用所有基于文本的领域通用的varchar(255)?(http://stackoverflow.com/questions/262238/are-there-disadvantages-to-using-a -generic-varchar255换所有基于文本的字段) – 2010-07-01 21:02:51

+0

此外,http://stackoverflow.com/questions/1262174/mysql-why-use-varchar20-instead-of-varchar255 – 2010-07-01 21:07:12

+6

一直以为MySQL文档是相当擅长解释不同之处:http://dev.mysql.com/doc/refman/5.0/en/char.html – 2010-07-01 21:09:28

回答

21

1)如果你不想限制一个存储的varchar的最大尺寸,那么是的,它是好的。这是说...

2)在许多情况下,你想设置一个varchar的大小的上限。假设您正在存储邮件列表,并且地址栏的空间有限。通过设置地址字段的上限,现在允许数据库为您执行最大地址行长度。

19

摘录:

CHAR和VARCHAR类型相似,但它们被存储和检索的方式不同。从MySQL 5.0.3开始,它们的最大长度以及是否保留了尾随空格。

CHAR和VARCHAR类型声明的长度指示要存储的最大字符数。例如,CHAR(30)最多可以容纳30个字符。

CHAR列的长度固定为您在创建表时声明的长度。长度可以是0到255之间的任何值。当存储CHAR值时,它们用空格填充到指定的长度。当CHAR值被检索时,尾随空格被删除。

VARCHAR列中的值是可变长度的字符串。在MySQL 5.0.3之前,长度可以指定为0到255之间的值,5.0.3和更高版本中的长度可以为0到65,535。 MySQL 5.0.3及更高版本中VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列中共享)和使用的字符集。

与CHAR相反,VARCHAR值存储为单字节或双字节长度前缀加数据。长度前缀表示该值中的字节数。如果值不超过255个字节,则列使用一个长度字节,如果值可能需要超过255个字节,则使用两个长度字节。

+6

请注意,您在引用时链接到源代码。 – 2010-07-01 21:10:18

+0

一个小的更正:链接的文档说'VARCHAR'对于MySQL> = 5.0.3具有65,535的上限。引用:“在MySQL 5.0.3之前,长度可以指定为0到255之间的值,5.0.3和更高版本中的长度可以为0到65,535.” – jweyrich 2013-10-21 22:31:13

1

1)从技术上讲,它是好的,因为这些字段在开始时只有1或2个字节的长度。之后,他们会根据需要增长。

2)尽管如此,良好的设计原则建议您适当地设置字段长度,以便a)如果有人通过表格方案并试图计算出特定字段中存储了多少数据,他们可以看到某些字段将保存的数据少于其他数据,并且b)可以防止数据库引擎执行少量额外工作,因为在插入期间,它必须从VARCHAR(10)字段中截取比VARCHAR(255)更少的空间。

你可以在这里查看额外的细节吧:

http://dev.mysql.com/doc/refman/5.0/en/char.html

1

我看过其他地方VARCHAR带有相对性能损失为char,当您对他们定义的列选择。所以,也许你想选择字符,如果你知道字段将永远是一定的长度,并且你有性能问题...

+0

我希望看到这个声明的参考。 – dotancohen 2013-12-02 14:21:49

+0

够公平的,我会给你一个,只有这个评论是在三年前,我甚至不记得我在哪里看到它。 – 2013-12-02 20:30:51

0

1)是的。

2)从历史上看,这是一次性能打击。

查看数据库,如sqlite,将所有内容都存储为文本,以证明它不再真正重要。

+4

sqlite不是完全高性能的数据库 - 如果强制将行大小变为变量,则varchar是性能命中。 – qdot 2012-02-24 17:24:42

+0

是的,但对大多数人来说,大多数人使用它的速度足够快 – 2012-02-26 10:09:39

+4

没错,但声称它不再重要,使用sqlite作为数据库工程的顶峰真的是一种误导。不,对于大多数人和大多数用户来说,它速度不够快 - 它只是配置最简单,而且成本最高,至少在最初阶段是这样。只要你永远不会有来自多个用户的同时请求,那就是。 – qdot 2012-02-26 15:19:09

4

CHAR Vs的VARCHAR

CHAR用于固定长度尺寸变。
VARCHAR用于可变长度大小变量。

E.g.

create table emp 
(f_name CHAR(20), 
l_name VARCHAR(20) 
); 

insert into emp values('Suraj','Chandak'); 

select length(f_name), length(l_name) from emp; 

Output will be 

length(f_name)   Length(l_name) 
    20      7 

CHAR vs VARCHAR

编辑

  • 您可以设置列的最大上限最好的答案。
  • 性能和存储会产生影响。

谢谢。

+0

问题是“1)将所有varchar设置为255是好的2)为什么要指定任何其他的长度?”,而不是CHAR vs VARCHAR。 – Davor 2014-11-18 11:27:48

0

这两个值类型之间的主要区别是在字符串之间进行比较时出现。

在一个CHAR列中,它的长度是预定义的,你必须在整个列长度内一直“运行”,而在VARCHAR列中,你需要在整个值长度内“运行”,而不是列长度​​,这在大多数情况下更快。

因此,如果存储在VARCHAR字段中,比字段长度小的值将比较快。

0

但我想知道什么是varchar长度的选项,例如, VARCHAR(50),VARCHAR(100),VARCHAR(255)

这对我来说似乎毫无意义,因为实际使用的空间取决于存储在数据库中的值。

例如指定VARCHAR(5)而不是VARCHAR(500)可以在某些情况下为您提供更好的性能,例如用于使用内存中临时表的操作。

另一种情况是,以限制柱长赞扬域要求(当你的值应不大于某个最大值,例如:在DNS全域名不得超过253个字符的长度)

3

固定长度(静态)表更快。当表格中的每一列都是“固定长度”时,该表格也被认为是“固定长度”“静态”。不是固定长度的列类型的例子是:VARCHAR,TEXT,BLOB。

http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/

所以,如果你的表没有任何其他字段是VARCHAR,文本或斑点;你可以使用char并使你的表格成为一个静态表格。这样他们更快。

+1

该答案与此处询问的问题无关。 – Davor 2014-11-18 11:27:08

+0

,你是对的。我不记得我为什么发布这个答案。 也许在那个时候,我正在寻找相关的东西。也许他编辑了他的问题? – musafar006 2014-11-22 13:50:13

+0

不知道,可以。我不知道如何看他的编辑历史,或者我是否有足够的声望来看它。 – Davor 2014-11-23 16:27:46

相关问题