2010-03-30 101 views
1

只是为了澄清,通过指定类似VARCHAR(45)的字符表示最多可能需要45个字符?我记得几年前我从别人那里听说,括号中的数字并不是指字符的号码,那么这个人试图向我解释一些我不明白和已经忘记的复杂的东西。数据库数据类型大小

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

但是,如果它给你这个列的所有数据列的大小的最大值,当你的数据大小变化时使用它不是更好吗?特别是如果你不知道你的数据量有多大。 VARCHAR需要指定大小(CHAR真的不需要对吗?),这不是更麻烦吗?

+0

相关问题: - http://stackoverflow.com/questions/758699/is-the-char-datatype-in​​-sql-obsolete-when-do-you-use-it – 2010-03-30 03:38:19

回答

1

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

例如:

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

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

SELECT * FROM test; 

以上将选择 “A          ” 为char_value和 “B” 为varchar_value

如果所有的值都差不多大小,CHAR可能是更好的选择,因为它往往需要比VARCHAR更少的存储空间。这是因为VARCHAR存储了值的长度和值本身,而CHAR只能存储(固定大小)值。

+1

它是怎么回事?比如说,我在varchar(255)中存储1个字节。所以,我有2个字节作为总长度。而字符将占用255个字节 – 2010-03-30 07:26:38

+1

是的,但是说在这种情况下你有varchar(2)与char(2),char(2)将是两个字节,varchar(2)将是3个字节。 – 2010-03-30 08:26:45

+0

我喜欢这个清晰的例子,谢谢! – yeeen 2010-03-30 16:24:17

1

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

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

所以,这实际上取决于你期望你的字符串有多长,长度的变化是多少。

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

+0

我认为它说不需要繁殖,只需添加? – yeeen 2010-03-30 16:34:11

+0

我不确定你指的是...你能直接从文档中引用吗? – Dancrumb 2010-03-31 00:55:50

0

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

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

0

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

0

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

varchar2(45 BYTE) 

varchar2(45 CHAR) 

Difference between BYTE and CHAR in column datatypes

+0

是的,它是abt字节。但是这个对话中的数字已经被验证为MySQL中的字符:) – yeeen 2010-03-30 16:35:33

+0

在Oracle,IIRC中并非如此。 – Samuel 2010-03-31 06:48:29

1

CHAR和VARCHAR竟变得无关紧要,如果你只有1可变长度字段在表中,像一个varchar或文本。 Mysql会自动将所有字符更改为varchar。

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

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