字符串数据类型是 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_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
和''
(空字符串)两个值。 -
[国家] 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 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
值都使用 4 字节的长度前缀来指示值中的字节数。 -
LONGTEXT [CHARACTER SET
charset_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 和 (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
是字符集中最大长度字符所需的字节数。