mysql varchar字节长度为255个问题

Dav*_*801 9 mysql

根据mysql文档:

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

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

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

dan*_*n04 10

MySQL文档:

声明CHAR和VARCHAR类型的长度指示要存储的最大字符数.例如,CHAR(30)最多可以包含30个字符.

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

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

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

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

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

  • @vigamage:"长度字节"是用于存储字符串长度的字节(与字符串的内容分开).有一个长度字节意味着字符串最多可以有255个字节,有两个长度字节意味着字符串最多可以是65535个字节,等等. (2认同)

Qua*_*noi 6

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

这取决于VARCHAR列的整理.

正如您所指出的,每个字符最多UTF8 可以使用三个字节,因此如果您声明的UTF8列长度​​超过85字符数,则有可能使用多个255字节来存储其数据,因此长度应存储在两个字节中字节.

如果使用latin1,则每个字符都以1字节存储.

所以答案是:

VARCHAR(85) COLLATE UTF8_GENERAL_CI
Run Code Online (Sandbox Code Playgroud)

, 要么

VARCHAR(255) COLLATE LATIN1_GENERAL_CI
Run Code Online (Sandbox Code Playgroud)