为什么我应该为MySQL中的varchar选择任何长度超过255的长度?

时间:2010-07-01 21:00:15

标签: mysql char varchar

我知道CHAR和VARCHAR之间的差异,

  

CHAR - 固定长度

     

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

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

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

所以我的问题是:

1)可以将我的所有varchar设置为255 2)为什么要指定任何其他长度?

9 个答案:

答案 0 :(得分:21)

1)如果你不想限制存储的varchar的最大大小,那么是的它没关系。那就是说......

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

答案 1 :(得分:19)

摘自MySQL documentation

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个字节,则列使用两个长度字节。

答案 2 :(得分: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

的最佳答案

修改

  • 您可以设置列的最大上限。
  • 性能和存储可以起作用。

感谢。

答案 3 :(得分:3)

  

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

     

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

因此,如果您的表没有任何其他varchar,text或blob字段;你可以使用char并使你的表成为静态表。这样他们就会更快。

答案 4 :(得分:1)

1)从技术上讲它很好,因为字段的开头长度只有1或2个字节。之后,他们会在必要时成长。

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

您可以在此处查看有关它的更多详细信息:

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

答案 5 :(得分:1)

我在其他地方读过,当你对使用它们定义的列运行选择时,varchar会相对于char具有性能命中。所以,也许你想选择char,如果你确定该字段总是一定的长度,并且你有性能问题......

答案 6 :(得分:1)

在对字符串进行比较时,这两种值类型之间的主要区别就出现了。

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

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

答案 7 :(得分:1)

  

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

     

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

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

另一种情况是限制列长度以补充域要求(当您的值不应大于某个最大值时。例如:DNS中的完整域名不得超过253个字符的长度)

答案 8 :(得分:0)

1)是的。

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

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