字符串数据类型有 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET。
在某些情况下,MySQL 可能会将字符串列更改为与 CREATE TABLE 或 ALTER TABLE 语句中指定的类型不同的类型。参见 第 15.1.20.7 节,“静默列规范更改”。
对于字符字符串列的定义 (CHAR、VARCHAR 和 TEXT 类型),MySQL 以字符单位解释长度规范。对于二进制字符串列的定义 (BINARY、VARBINARY 和 BLOB 类型),MySQL 以字节单位解释长度规范。
字符字符串数据类型的列定义 (CHAR、VARCHAR、TEXT 类型、ENUM、SET 以及任何同义词) 可以指定列的字符集和排序规则
CHARACTER SET指定字符集。如果需要,可以与COLLATE属性一起指定字符集的排序规则,以及任何其他属性。例如CREATE TABLE t ( c1 VARCHAR(20) CHARACTER SET utf8mb4, c2 TEXT CHARACTER SET latin1 COLLATE latin1_general_cs );此表定义创建了一个名为
c1的列,该列具有utf8mb4的字符集,并使用该字符集的默认排序规则,以及一个名为c2的列,该列具有latin1的字符集和区分大小写 (_cs) 的排序规则。当
CHARACTER SET和COLLATE属性缺失时,分配字符集和排序规则的规则在 第 12.3.5 节,“列字符集和排序规则” 中进行了描述。CHARSET是CHARACTER SET的同义词。为字符字符串数据类型指定
CHARACTER SET binary属性会导致列被创建为相应的二进制字符串数据类型:CHAR变成BINARY、VARCHAR变成VARBINARY、TEXT变成BLOB。对于ENUM和SET数据类型,不会发生这种情况; 它们按声明创建。假设你使用以下定义指定一个表CREATE TABLE t ( c1 VARCHAR(10) CHARACTER SET binary, c2 TEXT CHARACTER SET binary, c3 ENUM('a','b','c') CHARACTER SET binary );生成的表将具有以下定义
CREATE TABLE t ( c1 VARBINARY(10), c2 BLOB, c3 ENUM('a','b','c') CHARACTER SET binary );BINARY属性是非标准的 MySQL 扩展,它是指定列字符集的二进制 (_bin) 排序规则(或者如果未指定列字符集,则指定表默认字符集的排序规则)的简写。在这种情况下,比较和排序基于数值字符代码值。假设你使用以下定义指定一个表CREATE TABLE t ( c1 VARCHAR(10) CHARACTER SET latin1 BINARY, c2 TEXT BINARY ) CHARACTER SET utf8mb4;生成的表将具有以下定义
CREATE TABLE t ( c1 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_bin, c2 TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ) CHARACTER SET utf8mb4;在 MySQL 8.4 中,
BINARY属性已弃用,你应该预期它在 MySQL 的未来版本中将不再受支持。应用程序应该调整为使用显式的_bin排序规则。使用
BINARY指定数据类型或字符集保持不变。ASCII属性是CHARACTER SET latin1的简写。在旧版本的 MySQL 中受支持,ASCII已弃用; 使用CHARACTER SET代替。UNICODE属性是CHARACTER SET ucs2的简写。在旧版本的 MySQL 中受支持,UNICODE已弃用; 使用CHARACTER SET代替。
字符列的比较和排序基于分配给列的排序规则。对于 CHAR、VARCHAR、TEXT、ENUM 和 SET 数据类型,你可以使用二进制 (_bin) 排序规则或 BINARY 属性声明一个列,以使比较和排序使用底层字符代码值而不是词典排序。
有关在 MySQL 中使用字符集的更多信息,请参见 第 12 章,字符集、排序规则、Unicode。
[NATIONAL] CHAR[(M)] [CHARACTER SETcharset_name] [COLLATEcollation_name]固定长度字符串,在存储时始终用空格右填充到指定的长度。
M代表列的长度(以字符为单位)。M的取值范围为 0 到 255。如果省略M,则长度为 1。注意除非启用了
PAD_CHAR_TO_FULL_LENGTHSQL 模式,否则在检索CHAR值时,尾随空格将被移除。CHAR是CHARACTER的简写形式。NATIONAL CHAR(或其等效的简写形式NCHAR)是标准 SQL 定义CHAR列应使用一些预定义字符集的方式。MySQL 使用utf8mb3作为此预定义字符集。 第 12.3.7 节,“国家字符集”。CHAR BYTE数据类型是BINARY数据类型的别名。这是一种兼容性功能。MySQL 允许您创建类型为
CHAR(0)的列。这主要在您必须与依赖于列存在但实际上不使用其值的旧应用程序兼容时很有用。CHAR(0)在您需要一个只能取两个值的列时也很有用:定义为CHAR(0) NULL的列只占用一个位,并且只能取值NULL和''(空字符串)。[NATIONAL] VARCHAR(M) [CHARACTER SETcharset_name] [COLLATEcollation_name]可变长度字符串。
M代表以字符为单位的最大列长度。M的范围为 0 到 65,535。VARCHAR的有效最大长度受最大行大小(65,535 字节,在所有列之间共享)和使用的字符集的限制。例如,utf8mb3字符每个字符最多可能需要三个字节,因此使用utf8mb3字符集的VARCHAR列最多可以声明为 21,844 个字符。参见 第 10.4.7 节,“表列计数和行大小的限制”。MySQL 将
VARCHAR值存储为 1 字节或 2 字节长度前缀加上数据。长度前缀表示值中的字节数。如果值不超过 255 个字节,则VARCHAR列使用一个长度字节,如果值可能超过 255 个字节,则使用两个长度字节。注意MySQL 遵循标准 SQL 规范,并且 不 从
VARCHAR值中删除尾随空格。VARCHAR是CHARACTER VARYING的简写形式。NATIONAL VARCHAR是标准 SQL 定义VARCHAR列应使用一些预定义字符集的方式。MySQL 使用utf8mb3作为此预定义字符集。 第 12.3.7 节,“国家字符集”。NVARCHAR是NATIONAL VARCHAR的简写形式。BINARY类型类似于CHAR类型,但存储二进制字节字符串而不是非二进制字符字符串。可选长度M代表以字节为单位的列长度。如果省略,M默认为 1。VARBINARY类型类似于VARCHAR类型,但存储二进制字节字符串而不是非二进制字符字符串。M代表以字节为单位的最大列长度。最大长度为 255(28 − 1)字节的
BLOB列。每个TINYBLOB值使用一个 1 字节长度前缀存储,该前缀表示值中的字节数。TINYTEXT [CHARACTER SETcharset_name] [COLLATEcollation_name]最大长度为 255(28 − 1)个字符的
TEXT列。如果值包含多字节字符,则有效最大长度更短。每个TINYTEXT值使用一个 1 字节长度前缀存储,该前缀表示值中的字节数。最大长度为 65,535(216 − 1)字节的
BLOB列。每个BLOB值使用一个 2 字节长度前缀存储,该前缀表示值中的字节数。此类型可以给出可选长度
M。如果这样做,MySQL 会将该列创建为最小的BLOB类型,足以容纳长度为M字节的值。TEXT[(M)] [CHARACTER SETcharset_name] [COLLATEcollation_name]最大长度为 65,535(216 − 1)个字符的
TEXT列。如果值包含多字节字符,则有效最大长度更短。每个TEXT值使用一个 2 字节长度前缀存储,该前缀表示值中的字节数。此类型可以给出可选长度
M。如果这样做,MySQL 会将该列创建为最小的TEXT类型,足以容纳长度为M个字符的值。最大长度为 16,777,215(224 − 1)字节的
BLOB列。每个MEDIUMBLOB值使用一个 3 字节长度前缀存储,该前缀表示值中的字节数。MEDIUMTEXT [CHARACTER SETcharset_name] [COLLATEcollation_name]最大长度为 16,777,215(224 − 1)个字符的
TEXT列。如果值包含多字节字符,则有效最大长度更短。每个MEDIUMTEXT值使用一个 3 字节长度前缀存储,该前缀表示值中的字节数。最大长度为 4,294,967,295 或 4GB(232 − 1)字节的
BLOB列。LONGBLOB列的有效最大长度取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个LONGBLOB值使用一个 4 字节长度前缀存储,该前缀表示值中的字节数。LONGTEXT [CHARACTER SETcharset_name] [COLLATEcollation_name]最大长度为 4,294,967,295 或 4GB(232 − 1)个字符的
TEXT列。如果值包含多字节字符,则有效最大长度更短。LONGTEXT列的有效最大长度还取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个LONGTEXT值使用一个 4 字节长度前缀存储,该前缀表示值中的字节数。ENUM('value1','value2',...) [CHARACTER SETcharset_name] [COLLATEcollation_name]枚举。一个字符串对象,只能具有一个值,该值从值列表
'、value1''、value2'...、NULL或特殊''错误值中选择。ENUM值在内部表示为整数。ENUM列最多可以有 65,535 个不同的元素。单个
ENUM元素支持的最大长度为M<= 255 且 (Mxw) <= 1020,其中M是元素文本长度,w是字符集中最大长度字符所需的字节数。SET('value1','value2',...) [CHARACTER SETcharset_name] [COLLATEcollation_name]集合。一个字符串对象,可以具有零个或多个值,每个值必须从值列表中选择,例如
',value1'',value2'...SET值在内部表示为整数。SET列最多可以有 64 个不同的成员。单个
SET元素支持的最大长度为M<= 255 且 (Mxw) <= 1020,其中M是元素文本长度,w是字符集中最大长度字符所需的字节数。