我知道CHAR和VARCHAR之间的差异,
CHAR - 固定长度
VARCHAR - 可变长度(大小+ 1字节)
但是我想知道什么是varchar长度的选项,例如VARCHAR(50)
,VARCHAR(100)
,VARCHAR(255)
这对我来说似乎没有意义,因为使用的实际空间取决于存储在数据库中的值。
所以我的问题是:
1)可以将我的所有varchar设置为255 2)为什么要指定任何其他长度?
答案 0 :(得分:21)
1)如果你不想限制存储的varchar的最大大小,那么是的它没关系。那就是说......
2)在许多情况下,您希望设置varchar大小的上限。假设您正在存储邮件列表,并且地址行的空间有限。通过设置地址字段的上限,您现在允许数据库为您强制执行最大地址行长度。
答案 1 :(得分: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个字节,则列使用两个长度字节。
答案 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
的最佳答案
修改
感谢。
答案 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)更少的空间。
您可以在此处查看有关它的更多详细信息:
答案 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等数据库,将所有内容存储为文本,以证明它不再重要。