文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF(US Ltr) - 40.0Mb
PDF(A4) - 40.1Mb
手册页(TGZ) - 258.2Kb
手册页(Zip) - 365.3Kb
Info(Gzip) - 4.0Mb
Info(Zip) - 4.0Mb


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

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 变为 VARBINARY,而 TEXT 变为 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 9.0 中,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。

    注意

    当检索 CHAR 值时,尾随空格将被删除,除非启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式。

    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 是字符集中最大长度字符所需的字节数。