字符串数据类型是 CHAR、 VARCHAR、 BINARY、 VARBINARY、 BLOB、 TEXT、 ENUM 和 SET。
在某些情况下,MySQL 可能会将字符串列更改为与在 CREATE TABLE 或 ALTER TABLE 语句中指定的类型不同。请参阅 第 15.1.20.7 节,“Silent Column Specification Changes”。
对于字符字符串列的定义(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 节,“Column Character Set and Collation” 中描述。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 ); -
非标准的 MySQL 扩展
BINARY属性是指定列字符集(或表默认字符集,如果未指定列字符集)的二进制(_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.3 中,
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。Note尾随空格在检索
CHAR值时被删除,除非启用了PAD_CHAR_TO_FULL_LENGTHSQL 模式。CHAR是CHARACTER的简写形式。NATIONAL CHAR(或其等效的简写形式NCHAR)是标准 SQL 方式来定义CHAR列应该使用某个预定义的字符集。MySQL 使用utf8mb3作为这个预定义的字符集。第 12.3.7 节,《国家字符集》。数据类型
CHAR BYTE是BINARY数据类型的别名。这是一个兼容性功能。MySQL 允许您创建一个类型为
CHAR(0)的列。这主要是当您必须与旧应用程序兼容时有用,这些应用程序依赖于该列的存在,但实际上不使用其值。CHAR(0)也非常适合当您需要一个只能取两个值的列:定义为CHAR(0) NULL的列只占用一个位,并且只能取NULL和''(空字符串)两个值。 -
[国家] VARCHAR(M) [字符集charset_name] [排序collation_name]可变长度字符串。
M代表列的最大长度,以字符为单位。M的范围是 0 到 65,535。VARCHAR列的实际最大长度取决于最大行大小(65,535 字节,共享所有列)和使用的字符集。例如,使用utf8mb3字符集的字符可能需要每个字符 3 字节,因此使用utf8mb3字符集的VARCHAR列可以声明为最多 21,844 个字符。参见 第 10.4.7 节,“表列计数和行大小限制”。MySQL 将
VARCHAR值存储为 1 字节或 2 字节长度前缀加数据。长度前缀指示值中的字节数。VARCHAR列使用一个长度字节,如果值需要不超过 255 字节,使用两个长度字节,如果值可能超过 255 字节。NoteMySQL遵循标准 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值都使用 4 字节的长度前缀来指示值中的字节数。 -
LONGTEXT [CHARACTER SETcharset_name] [COLLATEcollation_name]一列最大长度为 4,294,967,295 或 4GB(232 − 1)字符的
TEXT列。该列的实际最大长度取决于客户端/服务器协议中的最大数据包大小和可用内存。如果值包含多字节字符,实际最大长度将更小。每个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是字符集中最大长度字符所需的字节数。