MySQL VARCHAR大小限制

19
如果我在表中有一个字段类型为VARCHAR(15)的列,并且我尝试插入长度为16的数据,MySQL会给出错误提示。
Data too long for column 'testname' at row 1

有人知道为什么MySQL中的VARCHAR字段是固定长度吗?另外,根据给定的大小,每个记录中的VARCHAR字段占用多少字节?


4
@Camilo - 假装自己已成功直到你真正成功! - Ben
4个回答

14
如果你将一个列设置为varchar(15),则最大允许的字节数为15。因此,如果不修改支持超过15个字符的列,就无法传递超过15个字符。如果存储一个4个字符的字符串,则应该只使用可能的15个字节中的大约4个字节,而如果使用char(15),则会用空字节填充剩余的11个字节。
参考链接:http://dev.mysql.com/doc/refman/5.0/en/char.html (我的字节计算可能有误,因为它总是-1/+1或类似的值)。

谢谢。在我的情况下,我真的不确定数据的长度会是多少。它可能很长,也可能很短。更准确地说: 如果我将列指定为Varchar(100),则数据可以是100个字符或50个字符。只是为了让我理解清楚。您的意思是它只会作为CHAR数据类型。我的意思是,它是否会为每个记录占用全部100个字节,还是只插入了50个字节。此外,在其他RDBMS中,如果我没有指定varchar限制,甚至在指定限制后,它也允许我插入超过限制的字符。 在MYSQL中是否可能呢? - MySQL DBA
3
varchar 的最大长度为 255。如果您要存储大量的数据,请尝试使用 TEXT 而不是 VARCHAR - meder omuraliev
6
Varchar 最多为 65,535 个字符。Char 最多为 255 个字符。此外,我不能使用 Text。 - MySQL DBA
1
我不确定为什么这么复杂。只需将varchar设置为您认为不会超过的金额即可。 - meder omuraliev
它是因为MySQL模式严格而抱怨吗? - dtakis
显示剩余3条评论

14

根据MySQL 5.0手册

VARCHAR列中的值是可变长度字符串。在MySQL 5.0.3之前,长度可以指定为0到255的值,在5.0.3及更高版本中可以指定为0到65,535。在MySQL 5.0.3及更高版本中,VARCHAR的有效最大长度受到最大行大小(65,535字节,该大小对所有列都共享)和使用的字符集的限制。

只有当我确定列需要保存的数据永远不会超过某个长度时,我才使用VARCHAR类型,即使如此,我也会很谨慎。如果我要存储文本字符串,则倾向于使用其中一种TEXT类型。

请查看MySQL存储要求以获取有关如何使用字节的更多信息。


以上暗示的一个非常重要的点是,如果VARCHAR长度超过限制,在数据库处于严格模式时将不会写入该行(会生成错误,但在非严格模式下截断也会导致警告)。 - Brian C

3

小的额外本地注释。使用的字节数取决于所使用的编码方案。在Latin1编码中,每个字符使用1个字节,但在UTF8中最多使用3个字节。有关详细信息,请参见mlambie答案中的链接。


谢谢。是的,我将使用UTF-8,因此它将占用双字节。 - MySQL DBA

1

如果您在这里查看,它应该会告诉您关于varchar的所有内容: http://dev.mysql.com/doc/refman/5.0/en/char.html

基本上,根据您选择的长度,它将使用1或2个字节来跟踪该列中当前字符串的长度,因此它将存储您放入的数据的字节数,再加上一或两个字节。

因此,如果您输入'abc',则该列在该行中将使用4或5个字节。

如果您使用char(15),即使是'abc'也会占用15个字节,因为数据是右填充以使用全部15个字节。


你好James,什么是数据右填充?您是否意味着即使我在varchar(15)列中输入了10个字符,它也会占用整个15个字节,就像Char(15)一样? - MySQL DBA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接