Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

13.3.1 字符串数据类型语法

字符串数据类型是CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET

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

对于字符字符串列(CHARVARCHARTEXT类型),MySQL将长度规范解释为字符单元。对于二进制字符串列(BINARYVARBINARYBLOB类型),MySQL将长度规范解释为字节单元。

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

  • 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 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
    );
  • 代码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指定数据类型或字符集的用法保持不变。

  • 代码ASCIICHARACTER SET latin1的简写。支持在更早的MySQL版本中,但ASCII已被弃用;使用CHARACTER SET代替。

  • 代码UNICODECHARACTER SET ucs2的简写。支持在更早的MySQL版本中,但UNICODE已被弃用;使用CHARACTER SET代替。

字符列比较和排序是根据列的排序规则进行的。对于CHARVARCHARTEXTENUMSET数据类型,您可以将列声明为具有二进制(_bin)排序规则或BINARY属性,以便在比较和排序时使用 underlying 字符代码值,而不是词法顺序。

关于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节,“National Character Set”

    The 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。实际的最大长度取决于最大行大小(65,535 字节,共享给所有列)和使用的字符集。例如,使用 utf8mb3 字符集的 VARCHAR 列可以声明为最多 21,844 个字符。请参阅 第10.4.7节,“Limits on Table Column Count and Row Size”.

    MySQL 将 VARCHAR 值存储为 1 字节或 2 字节的长度前缀加数据。长度前缀指示值的字节数。一个 VARCHAR 列使用一个长度字节,如果值不需要超过 255 字节,使用两个长度字节,如果值可能需要超过 255 字节。

    Note

    MySQL遵循标准 SQL 规范,不会从 VARCHAR 值中删除尾部空格。

    VARCHARCHARACTER VARYING 的简写。NATIONAL VARCHAR 是标准SQL方式,定义VARCHAR列使用某个预定义字符集。MySQL 使用 utf8mb3 作为预定义字符集。第12.3.7节,“The National Character Set”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]

    一个TEXT列,最大长度为255(28 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。每个TINYTEXT值使用1个字节的长度前缀来表示值的字节数。

  • BLOB[(M)]

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

    可选的长度M可以为该类型指定。如果这样做,MySQL将创建一个足够大的BLOB列来存储值M字节长。

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

    一个TEXT列,最大长度为65,535(216 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。每个TEXT值使用2个字节的长度前缀来表示值的字节数。

    可选的长度M可以为该类型指定。如果这样做,MySQL将创建一个足够大的TEXT列来存储值M字符长。

  • MEDIUMBLOB

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

  • MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name]

    一个TEXT列,最大长度为16,777,215(224 − 1)个字符。实际最大长度小于该值,如果值包含多字节字符。每个MEDIUMTEXT值使用3个字节的长度前缀,表示值的字节数。

  • LONGBLOB

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

  • LONGTEXT [CHARACTER SET charset_name [COLLATE collation_name]

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

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

    枚举。一个字符串对象,可以有且仅有一个值,来自列表'value1', 'value2', ..., NULL或特殊''错误值。ENUM值内部表示为整数。

    一个ENUM列最多可以有65,535个唯一元素。

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

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

    一个集合。一个字符串对象,可以有零个或多个值,每个值都必须来自列表'value1''value2'、...SET值是内部表示为整数。

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

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