根据mysql文档:
如果值不超过255个字节,则列使用一个长度字节, 如果值可能需要,则两个长度字节 超过255个字节
和
最大行大小限制了 列数因为总数 所有列的宽度不能超过 这个大小。例如,utf8 字符最多需要三个字节 每个字符,所以对于CHAR(255) CHARACTER SET utf8列,服务器 每个必须分配255×3 = 765个字节 值。因此,表不能 包含超过65,535/765 = 85 这样的专栏。
为清楚起见,我可以在varchar参数中设置的最大值是什么,所以它只用1个字节来存储它的长度?
答案 0 :(得分:10)
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个。