13.3.1 字符串数据类型语法
字符串数据类型是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
属性指定字符集的排序规则,along with any other attributes。例如: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 );
-
代码
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
属性,以便在比较和排序时使用 underlying 字符代码值,而不是词法顺序。
关于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节,“National Character Set”。The
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。实际的最大长度取决于最大行大小(65,535 字节,共享给所有列)和使用的字符集。例如,使用utf8mb3
字符集的VARCHAR
列可以声明为最多 21,844 个字符。请参阅 第10.4.7节,“Limits on Table Column Count and Row Size”.MySQL 将
VARCHAR
值存储为 1 字节或 2 字节的长度前缀加数据。长度前缀指示值的字节数。一个VARCHAR
列使用一个长度字节,如果值不需要超过 255 字节,使用两个长度字节,如果值可能需要超过 255 字节。NoteMySQL遵循标准 SQL 规范,不会从
VARCHAR
值中删除尾部空格。VARCHAR
是CHARACTER VARYING
的简写。NATIONAL VARCHAR
是标准SQL方式,定义VARCHAR列使用某个预定义字符集。MySQL 使用utf8mb3
作为预定义字符集。第12.3.7节,“The National Character Set”。NVARCHAR
是NATIONAL VARCHAR
的简写。 -
BINARY 类型类似于 CHAR 类型,但存储二进制字节字符串,而不是非二进制字符字符串。可选的长度
M
表示列的长度,以字节为单位。如果省略,M
将默认为 1。 -
VARBINARY 类型类似于 VARCHAR 类型,但存储二进制字节字符串,而不是非二进制字符字符串。
M
表示最大列长度,以字节为单位。 -
长度为 255 (28 − 1) 字节的 BLOB 列。每个
TINYBLOB
值使用 1 字节的长度前缀,表示值的字节长度。 -
TINYTEXT [CHARACTER SET
charset_name
] [COLLATEcollation_name
]一个
TEXT
列,最大长度为255(28 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。每个TINYTEXT
值使用1个字节的长度前缀来表示值的字节数。 -
一个
BLOB
列,最大长度为65,535(216 − 1)个字节。每个BLOB
值使用2个字节的长度前缀来表示值的字节数。可选的长度
M
可以为该类型指定。如果这样做,MySQL将创建一个足够大的BLOB
列来存储值M
字节长。 -
TEXT[(
M
)] [CHARACTER SETcharset_name
] [COLLATEcollation_name
]一个
TEXT
列,最大长度为65,535(216 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。每个TEXT
值使用2个字节的长度前缀来表示值的字节数。可选的长度
M
可以为该类型指定。如果这样做,MySQL将创建一个足够大的TEXT
列来存储值M
字符长。 -
一个
BLOB
列,最大长度为16,777,215(224 − 1)个字节。每个MEDIUMBLOB
值使用3个字节的长度前缀来表示值的字节数。 -
MEDIUMTEXT [CHARACTER SET
charset_name
] [COLLATEcollation_name
]一个
TEXT
列,最大长度为16,777,215(224 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。每个MEDIUMTEXT
值使用3个字节的长度前缀,表示值的字节数。 -
一个
BLOB
列,最大长度为4,294,967,295或4GB(232 − 1)字节。实际最大长度取决于客户端/服务器协议的最大数据包大小和可用内存。每个LONGBLOB
值使用4个字节的长度前缀,表示值的字节数。 -
LONGTEXT [CHARACTER SET
charset_name
[COLLATEcollation_name
]一个
TEXT
列,最大长度为4,294,967,295或4GB(232 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。实际最大长度也取决于客户端/服务器协议的最大数据包大小和可用内存。每个LONGTEXT
值使用4个字节的长度前缀,表示值的字节数。 -
ENUM('
value1
','value2
',...) [CHARACTER SETcharset_name
[COLLATEcollation_name
]枚举。一个字符串对象,可以有且仅有一个值,来自列表
'
,value1
''
,value2
'...
,NULL
或特殊''
错误值。ENUM
值内部表示为整数。一个
ENUM
列最多可以有65,535个唯一元素。单个
ENUM
元素的最大支持长度为M
<=255和(M
×w
)<=1020,其中M
是元素字面值长度和w
是字符集中最大字符所需的字节数。 -
SET('
value1
','value2
',...) [CHARACTER SETcharset_name
[COLLATEcollation_name
]]一个集合。一个字符串对象,可以有零个或多个值,每个值都必须来自列表
'
、value1
''
、...value2
'SET
值是内部表示为整数。一个
SET
列最多可以有64个不同的成员。单个
SET
元素的最大支持长度为M
<=255和(M
×w
)<=1020,其中M
是元素字面值长度和w
是字符集中最大字符所需的字节数。