数据库数据类型大小

时间:2010-03-30 02:57:45

标签: sql mysql database types

只是澄清一下,通过指定像VARCHAR(45)这样的东西意味着最多可以占用45个字符?我记得几年前我从某人那里听说括号中的数字并不是指字符的数字,然后那个人试图向我解释一些我不理解和忘记的相当复杂的事情。

CHAR和VARCHAR有什么区别?我确实搜索了一下,看到CHAR给出了列的最大大小,如果你的数据有固定的大小,最好使用它,如果你的数据大小不同,最好使用VARCHAR。

但是,如果它为您提供了此列所有数据列的最大大小,那么在数据大小变化时使用它是不是更好?特别是如果你不知道你的数据大小有多大。 VARCHAR需要指定大小(CHAR真的不需要吗?),是不是更麻烦?

6 个答案:

答案 0 :(得分:1)

您还必须使用CHAR指定尺寸。对于CHAR,列值用空格填充以填充您指定的大小,而使用VARCHAR时,只存储您指定的实际值。

例如:

CREATE TABLE test (
    char_value CHAR(10),
    varchar_value VARCHAR(10)
);

INSERT INTO test VALUES ('a', 'b');

SELECT * FROM test;

上述内容将为char_value选择“a”,为varchar_value选择“b”

如果您的所有值大小相同,CHAR可能是更好的选择,因为它通常需要的存储空间少于VARCHAR。这是因为VARCHAR存储了值的长度和值本身,而CHAR只能存储(固定大小)值。

答案 1 :(得分:1)

MySQL documentation很好地解释了各种数据类型的存储要求。

特别是,对于长度为L的字符串,CHAR(M)数据类型将占用(M xc)个字节(其中c是存储字符所需的字节数...这取决于字符集正在使用)。 VARCHAR(M)将占用(L + 1)或(L + 2),具体取决于M是< = 255还是> 255。

所以,这实际上取决于你对弦乐的期望,长度的变化是什么。

注意:文档没有讨论字符集对VARCHAR类型的存储要求的影响。我试图准确地引用它,但我的猜测是你需要将字符串长度乘以字符字节宽度以获得存储要求。

答案 2 :(得分:1)

如果表中只有1个可变长度字段,那么

char和varchar实际上变得无关紧要,如varchar或text。 Mysql会自动将所有char更改为varchar。

固定长度/大小记录可以为您提供额外的性能,但您不能使用任何可变长度字段类型。原因是mysql查找下一条记录会更快更容易。

例如,如果执行SELECT * FROM表LIMIT 10,则mysql必须扫描表文件中的第10条记录。这意味着找到每条记录的结尾,直到找到第10条记录的结尾。但是如果你的表有固定的长度/大小记录,mysql只需要知道记录大小然后跳过10 x #bytes。

答案 3 :(得分:0)

如果您知道列中包含少量固定数量的字符,请使用CHAR,否则请使用varchar。 CHAR列填充到最大长度。

VARCHAR的开销很小(4-8个字节,取决于RDBMS),但只使用开销+实际存储的字符数。

答案 4 :(得分:0)

对于您知道它们将保持不变的值,例如对于电话号码,邮政编码等,最好使用“char”。

答案 5 :(得分:0)

你不记得的复杂的东西是45指的是字节,而不是字符。如果您使用多字节字符编码,则不一样。在Oracle中,您可以明确指定字节或字符。

varchar2(45 BYTE)

varchar2(45 CHAR)

请参阅Difference between BYTE and CHAR in column datatypes