Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  String Data Type Syntax

13.3.1 字符串数据类型语法

字符串数据类型是 CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET

在某些情况下,MySQL 可能会将字符串列更改为与在 CREATE TABLEALTER TABLE 语句中指定的类型不同。请参阅 第 15.1.20.7 节,“Silent Column Specification Changes”

对于字符字符串列的定义(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 节,“Column Character Set and Collation” 中描述。

    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
    );
  • 非标准的 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 指定数据类型或字符集保持不变。

  • 属性 ASCIICHARACTER SET latin1 的简写形式。支持旧版本的 MySQL,ASCII 已弃用;使用 CHARACTER SET 代替。

  • 属性 UNICODECHARACTER SET ucs2 的简写形式。支持旧版本的 MySQL,UNICODE 已弃用;使用 CHARACTER SET 代替。

字符列比较和排序基于分配给列的排序。对于 CHAR, VARCHAR, TEXT, ENUM, 和 SET 数据类型,您可以声明一个列具有二进制(_bin)排序或 BINARY 属性,以便比较和排序使用基础字符代码值,而不是词汇排序。

有关 MySQL 中字符集使用的更多信息,请参阅 第 12 章,《字符集、排序、Unicode》

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

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

    Note

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

    CHARCHARACTER 的简写形式。NATIONAL CHAR(或其等效的简写形式 NCHAR)是标准 SQL 方式来定义 CHAR 列应该使用某个预定义的字符集。MySQL 使用 utf8mb3 作为这个预定义的字符集。第 12.3.7 节,《国家字符集》

    数据类型 CHAR BYTEBINARY 数据类型的别名。这是一个兼容性功能。

    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 字节。

    Note

    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 值都使用 4 字节的长度前缀来指示值中的字节数。

  • LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name]

    一列最大长度为 4,294,967,295 或 4GB(232 − 1)字符的 TEXT 列。该列的实际最大长度取决于客户端/服务器协议中的最大数据包大小和可用内存。如果值包含多字节字符,实际最大长度将更小。每个 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 是字符集中最大长度字符所需的字节数。