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_LENGTHSQL 模式。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 SETcharset_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 SETcharset_name] [COLLATEcollation_name]一个
TEXT列,最大长度为16,777,215(224 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。每个MEDIUMTEXT值使用3个字节的长度前缀,表示值的字节数。 -
一个
BLOB列,最大长度为4,294,967,295或4GB(232 − 1)字节。实际最大长度取决于客户端/服务器协议的最大数据包大小和可用内存。每个LONGBLOB值使用4个字节的长度前缀,表示值的字节数。 -
LONGTEXT [CHARACTER SETcharset_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是字符集中最大字符所需的字节数。