11.3.1 字符串数据类型语法

字符串数据类型为CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET

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

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

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

  • CHARACTER SET指定字符集。如果需要,可以使用COLLATE属性以及任何其他属性来指定字符集的排序规则。例如:
CREATE TABLE t
(
    c1 VARCHAR(20) CHARACTER SET utf8,
    c2 TEXT CHARACTER SET latin1 COLLATE latin1_general_cs
);

该 table 定义创建一个名为c1的列,该列的字符集为utf8,默认排序规则为该字符集;创建一个名为c2的列,其字符集为latin1,并且区分大小写(_cs)。

第 10.3.5 节“列字符集和排序规则”中描述了当CHARACTER SETCOLLATE属性中的一个或两个都缺失时分配字符集和排序规则的规则。

CHARSETCHARACTER SET的同义词。

  • 为字符串数据类型指定CHARACTER SET binary属性会使该列创建为相应的二进制字符串数据类型:CHAR变为BINARYVARCHAR变为VARBINARY,并且TEXT变为BLOB。对于ENUMSET数据类型,不会发生这种情况。它们是按声明创建的。假设您使用此定义指定一个 table:
CREATE TABLE t
(
  c1 VARCHAR(10) CHARACTER SET binary,
  c2 TEXT CHARACTER SET binary,
  c3 ENUM('a','b','c') CHARACTER SET binary
);

结果 table 具有以下定义:

CREATE TABLE t
(
  c1 VARBINARY(10),
  c2 BLOB,
  c3 ENUM('a','b','c') CHARACTER SET binary
);
  • BINARY属性是非标准的 MySQL 扩展,它是用于指定列字符集(或未指定列字符集的 table 默认字符集)的二进制(_bin)排序规则的简写。在这种情况下,比较和排序基于数字字符代码值。假设您使用此定义指定一个 table:
CREATE TABLE t
(
  c1 VARCHAR(10) CHARACTER SET latin1 BINARY,
  c2 TEXT BINARY
) CHARACTER SET utf8mb4;

结果 table 具有以下定义:

CREATE TABLE t (
  c1 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_bin,
  c2 TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
) CHARACTER SET utf8mb4;
  • ASCII属性是CHARACTER SET latin1的简写。

  • UNICODE属性是CHARACTER SET ucs2的简写。

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

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

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

一个固定长度的字符串,在存储时总是用空格填充到指定的长度。 * M *table 示以字符为单位的列长。 * M 的范围是 0 到 255.如果省略 M *,则长度是 1.

Note

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

CHARCHARACTER的简写。 NATIONAL CHAR(或等效的缩写形式NCHAR)是定义CHAR列应使用某些 sched 义字符集的标准 SQL 方法。 MySQL 使用utf8作为此 sched 义字符集。 第 10.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 *table 示最大列长度,以字符为单位。 * M *的范围是 0 到 65,535. VARCHAR的有效最大长度取决于最大行大小(65,535 字节,在所有列之间共享)和所使用的字符集。例如,utf8个字符每个字符最多需要三个字节,因此使用utf8字符集的VARCHAR列可以声明为最多 21,844 个字符。参见第 8.4.7 节“table 列数和行大小的限制”

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

Note

MySQL 遵循标准的 SQL 规范,并且“不” *不从VARCHAR值中删除尾随空格。

VARCHARCHARACTER VARYING的简写。 NATIONAL VARCHAR是定义VARCHAR列应使用一些 sched 义字符集的标准 SQL 方法。 MySQL 使用utf8作为此 sched 义字符集。 第 10.3.7 节“国家字符集”NVARCHARNATIONAL VARCHAR的简写。

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

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

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

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

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

可以为此类型指定一个可选的长度* M 。如果这样做,MySQL 将创建该列为最小的BLOB类型,该类型的大小足以容纳值 M *字节长。

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

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

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

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

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

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

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

ENUM列最多可包含 65,535 个不同的元素。 (实际限制小于 3000.)在 table 的ENUMSET列中,一个 table 最多可以包含 255 个唯一元素列 table 定义。有关这些限制的更多信息,请参见.frm 文件结构施加的限制

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

SET列最多可包含 64 个不同的成员。在 table 的ENUMSET列中,一个 table 最多可以包含 255 个唯一元素列 table 定义。有关此限制的更多信息,请参见.frm 文件结构施加的限制