文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  字符串数据类型语法

13.3.1 字符串数据类型语法

字符串数据类型有 CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET

在某些情况下,MySQL 可能会将字符串列更改为与 CREATE TABLEALTER TABLE 语句中指定的类型不同的类型。参见 第 15.1.20.7 节,“静默列规范更改”

对于字符字符串列的定义 (CHARVARCHARTEXT 类型),MySQL 以字符单位解释长度规范。对于二进制字符串列的定义 (BINARYVARBINARYBLOB 类型),MySQL 以字节单位解释长度规范。

字符字符串数据类型的列定义 (CHARVARCHARTEXT 类型、ENUMSET 以及任何同义词) 可以指定列的字符集和排序规则

  • 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 SETCOLLATE 属性缺失时,分配字符集和排序规则的规则在 第 12.3.5 节,“列字符集和排序规则” 中进行了描述。

    CHARSETCHARACTER SET 的同义词。

  • 为字符字符串数据类型指定 CHARACTER SET binary 属性会导致列被创建为相应的二进制字符串数据类型: CHAR 变成 BINARYVARCHAR 变成 VARBINARYTEXT 变成 BLOB。对于 ENUMSET 数据类型,不会发生这种情况; 它们按声明创建。假设你使用以下定义指定一个表

    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 代替。

字符列的比较和排序基于分配给列的排序规则。对于 CHARVARCHARTEXTENUMSET 数据类型,你可以使用二进制 (_bin) 排序规则或 BINARY 属性声明一个列,以使比较和排序使用底层字符代码值而不是词典排序。

有关在 MySQL 中使用字符集的更多信息,请参见 第 12 章,字符集、排序规则、Unicode

  • [NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]

    固定长度字符串,在存储时始终用空格右填充到指定的长度。 M 代表列的长度(以字符为单位)。M 的取值范围为 0 到 255。如果省略 M,则长度为 1。

    注意

    除非启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式,否则在检索 CHAR 值时,尾随空格将被移除。

    CHARCHARACTER 的简写形式。 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 SET charset_name] [COLLATE collation_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 值中删除尾随空格。

    VARCHARCHARACTER VARYING 的简写形式。 NATIONAL VARCHAR 是标准 SQL 定义 VARCHAR 列应使用一些预定义字符集的方式。MySQL 使用 utf8mb3 作为此预定义字符集。 第 12.3.7 节,“国家字符集”NVARCHARNATIONAL VARCHAR 的简写形式。

  • BINARY[(M)]

    BINARY 类型类似于 CHAR 类型,但存储二进制字节字符串而不是非二进制字符字符串。可选长度 M 代表以字节为单位的列长度。如果省略, M 默认为 1。

  • VARBINARY(M)

    VARBINARY 类型类似于 VARCHAR 类型,但存储二进制字节字符串而不是非二进制字符字符串。 M 代表以字节为单位的最大列长度。

  • TINYBLOB

    最大长度为 255(28 − 1)字节的 BLOB 列。每个 TINYBLOB 值使用一个 1 字节长度前缀存储,该前缀表示值中的字节数。

  • TINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name]

    最大长度为 255(28 − 1)个字符的 TEXT 列。如果值包含多字节字符,则有效最大长度更短。每个 TINYTEXT 值使用一个 1 字节长度前缀存储,该前缀表示值中的字节数。

  • BLOB[(M)]

    最大长度为 65,535(216 − 1)字节的 BLOB 列。每个 BLOB 值使用一个 2 字节长度前缀存储,该前缀表示值中的字节数。

    此类型可以给出可选长度 M。如果这样做,MySQL 会将该列创建为最小的 BLOB 类型,足以容纳长度为 M 字节的值。

  • TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]

    最大长度为 65,535(216 − 1)个字符的 TEXT 列。如果值包含多字节字符,则有效最大长度更短。每个 TEXT 值使用一个 2 字节长度前缀存储,该前缀表示值中的字节数。

    此类型可以给出可选长度 M。如果这样做,MySQL 会将该列创建为最小的 TEXT 类型,足以容纳长度为 M 个字符的值。

  • MEDIUMBLOB

    最大长度为 16,777,215(224 − 1)字节的 BLOB 列。每个 MEDIUMBLOB 值使用一个 3 字节长度前缀存储,该前缀表示值中的字节数。

  • MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name]

    最大长度为 16,777,215(224 − 1)个字符的 TEXT 列。如果值包含多字节字符,则有效最大长度更短。每个 MEDIUMTEXT 值使用一个 3 字节长度前缀存储,该前缀表示值中的字节数。

  • LONGBLOB

    最大长度为 4,294,967,295 或 4GB(232 − 1)字节的 BLOB 列。 LONGBLOB 列的有效最大长度取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个 LONGBLOB 值使用一个 4 字节长度前缀存储,该前缀表示值中的字节数。

  • LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name]

    最大长度为 4,294,967,295 或 4GB(232 − 1)个字符的 TEXT 列。如果值包含多字节字符,则有效最大长度更短。 LONGTEXT 列的有效最大长度还取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个 LONGTEXT 值使用一个 4 字节长度前缀存储,该前缀表示值中的字节数。

  • ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]

    枚举。一个字符串对象,只能具有一个值,该值从值列表 'value1''value2'...NULL 或特殊 '' 错误值中选择。 ENUM 值在内部表示为整数。

    ENUM 列最多可以有 65,535 个不同的元素。

    单个 ENUM 元素支持的最大长度为 M <= 255 且 (M x w) <= 1020,其中 M 是元素文本长度,w 是字符集中最大长度字符所需的字节数。

  • SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]

    集合。一个字符串对象,可以具有零个或多个值,每个值必须从值列表中选择,例如 'value1''value2'... SET 值在内部表示为整数。

    SET 列最多可以有 64 个不同的成员。

    单个 SET 元素支持的最大长度为 M <= 255 且 (M x w) <= 1020,其中 M 是元素文本长度,w 是字符集中最大长度字符所需的字节数。