VARCHAR大小限制了吗?

时间:2010-12-01 13:35:53

标签: php mysql database-design varchar

  

可能重复:
  Importance of varchar length in MySQL table

使用VARCHAR时(假设这是短字符串的正确数据类型)大小是否重要?如果我将它设置为20个字符,那么占用的空间会少于255个字符吗?

8 个答案:

答案 0 :(得分:11)

通常,对于VARCHAR字段,每个字段中存储的数据量决定了它在磁盘上的占用空间而不是最大大小(与始终具有相同占用空间的CHAR字段不同)。

在900字节(900 byte index size limit in character length)索引的所有字段中存储的总数据有一个上限。

你创造的领域越大,人们就越有可能尝试用于你想要的目的以外的其他目的 - 显示价值所需的屏幕空间越大 - 所以尝试选择<强大>正确尺寸,而不是假设如果你尽可能大,它将节省你不得不重新审视设计。

答案 1 :(得分:10)

是的,在索引多列时很重要。

  

前缀最长可达1000个字节(InnoDB表为767个字节)。请注意,前缀限制以字节为单位,而CREATE TABLE语句中的前缀长度则被解释为字符数。在为使用多字节字符集的列指定前缀长度时,请务必考虑到这一点。

来源:http://dev.mysql.com/doc/refman/5.0/en/column-indexes.html

在latin1排序规则中,您只能指定3列varchar(255) 虽然可以为varchar(20)

指定最多50列

在没有正确索引的情况下,它将减慢查询速度

在储存方面,它没有区别,
varchar代表variable-length strings

答案 2 :(得分:5)

实际差异是:

  • TINYTEXT和其他TEXT字段与MySQL堆内的内存行分开存储,而VARCHAR()字段加起来限制为64k(因此在TINYTEXT中可以有超过64k,而你不会VARCHAR)。

  • TINYTEXT和其他“blob-like”字段将强制SQL层(MySQL)在使用它们时使用磁盘上的临时表,而VARCHAR仍将在“内存中”排序(尽管将转换为CHAR为全宽)。

  • InnoDB内部并不关心它是tinytext还是varchar。它很容易验证,创建两个表,一个使用VARCHAR(255),另一个使用TINYINT,并向两者插入记录。它们都将采用单个16k页面 - 而如果使用溢出页面,TINYTEXT表应显示为在“SHOW TABLE STATUS”中至少占用32k。

我通常更喜欢VARCHAR(255) - 它们不会对单行造成太多的堆碎片,并且可以在MySQL内存中作为单个64k对象处理。在InnoDB上,大小差异可以忽略不计。

答案 3 :(得分:4)

在MySQL的文档中: http://dev.mysql.com/doc/refman/5.0/en/char.html

你有一个表格,表示VARCHAR(4)的字节数(与CHAR(4)相比)。

一个没有字符串的简单VARCHAR(4),只有1个字节。然后,没有字符串的简单VARCHAR(255)是1byte。带有'ab'的VARCHAR(4)是3个字节,带有'ab'的VARCHAR(255)是3个字节。它是相同的,但有长度限制:)

答案 4 :(得分:2)

这对性能没有影响。在这种情况下,约束仅有助于确保数据完整性。

答案 5 :(得分:1)

This回答可以帮到你。

答案 6 :(得分:0)

如果将其设置为20,则仅保存前20个字符。所以是的,它占用的空间将少于255个字符:)。

答案 7 :(得分:0)

required storage space for VARCHAR如下:

  

VARCHAR(L)VARBINARY(L) - L + 1个字节,如果列值需要0 - 255个字节,L + 2个字节,如果值可能需要超过255个字节

所以VARCHAR只需要字符串的空格加上一个或两个额外的字节作为字符串的长度。