字符串数据类型有 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 9.0 中,
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。注意当检索
CHAR
值时,尾随空格将被删除,除非启用了PAD_CHAR_TO_FULL_LENGTH
SQL 模式。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 SET
charset_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 SET
charset_name
] [COLLATEcollation_name
]最大长度为 16,777,215(224 − 1)个字符的
TEXT
列。如果值包含多字节字符,则有效最大长度会更短。每个MEDIUMTEXT
值使用一个 3 字节的长度前缀存储,该前缀指示值中的字节数。最大长度为 4,294,967,295 或 4GB(232 − 1)字节的
BLOB
列。LONGBLOB
列的有效最大长度取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个LONGBLOB
值使用一个 4 字节的长度前缀存储,该前缀指示值中的字节数。LONGTEXT [CHARACTER SET
charset_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 且 (M
xw
) <= 1020,其中M
是元素字面量的长度,w
是字符集中最大长度字符所需的字节数。SET('
value1
','value2
',...) [CHARACTER SETcharset_name
] [COLLATEcollation_name
]一个集合。一个字符串对象,可以包含零个或多个值,每个值必须从值列表中选择
'
,value1
''
,value2
'...
SET
值在内部表示为整数。一个
SET
列最多可以有 64 个不同的成员。单个
SET
元素的最大支持长度为M
<= 255 且 (M
xw
) <= 1020,其中M
是元素字面量的长度,w
是字符集中最大长度字符所需的字节数。