mysql varchar字节长度为255个问题

时间:2010-12-27 14:09:26

标签: mysql

根据mysql文档:

  

如果值不超过255个字节,则列使用一个长度字节,   如果值可能需要,则两个长度字节   超过255个字节

  

最大行大小限制了   列数因为总数   所有列的宽度不能超过   这个大小。例如,utf8   字符最多需要三个字节   每个字符,所以对于CHAR(255)   CHARACTER SET utf8列,服务器   每个必须分配255×3 = 765个字节   值。因此,表不能   包含超过65,535/765 = 85   这样的专栏。

为清楚起见,我可以在varchar参数中设置的最大值是什么,所以它只用1个字节来存储它的长度?

3 个答案:

答案 0 :(得分:10)

来自the MySQL documentation

  

CHAR和VARCHAR类型是   声明的长度表示   您的最大字符数   想要存储。例如,CHAR(30)   最多可容纳30个字符。

     

[VARCHAR]列使用一个长度   如果值不超过,则为byte   255 字节,两个长度字节if   值可能需要超过255   的字节

这使得您的问题的答案取决于字符编码。

使用像Windows-1252这样的单字节编码(MySQL调用latin1),字符长度与字节长度相同,因此您可以使用VARCHAR(255)

对于UTF-8,VARCHAR(N)可能需要最多3N字节,如果所有字符都在U + 0800到U + FFFF范围内的话。因此,VARCHAR(85)是确保单字节字节长度(最多需要255个字节)的最大值。

(请注意,MySQL显然不支持BMP之外的字符.UTF-8的官方定义允许每个字符4个字节。)

答案 1 :(得分:6)

  

为清楚起见,那么我可以在varchar参数中设置的最大值是什么,所以它只用1个字节来存储它的长度?

这取决于VARCHAR列的整理。

正如您所指出的,UTF8 可能每个字符最多使用三个字节,因此如果您声明UTF8列长度超过85个字符,那么它有可能使用超过255个字节来存储其数据,因此长度应该存储在一个双字节字段中。

如果您使用latin1,则每个字符都存储在1字节中。

所以答案是:

VARCHAR(85) COLLATE UTF8_GENERAL_CI

,或

VARCHAR(255) COLLATE LATIN1_GENERAL_CI

答案 2 :(得分:0)

我认为你将字符串大小与字符表示混淆。

例如,您可以使用一个占用4个字节来表示它的字符,并将其放在字符串中,其最大存储大小只需要一个字节来保存长度,因为其中的字符少于255个。