# 11.3.1 字符串数据类型语法

字符串数据类型是字符,VARCHAR,二进制,变量,斑点,文本,枚举, 和.

在某些情况下,MySQL 可能会将字符串列更改为不同于创建表要么更改表陈述。看第 13.1.20.7 节,“静默列规范更改”.

对于字符串列的定义(字符,VARCHAR, 和文本types),MySQL以字符单位解释长度规范。对于二进制字符串列的定义(二进制,变量, 和斑点types),MySQL以字节为单位解释长度规范。

字符串数据类型的列定义字符,VARCHAR, 这文本类型,枚举,, 和任何同义词)可以指定列字符集和排序规则:

  • 字符集指定字符集。如果需要,可以使用整理属性,以及任何其他属性。例如:

    CREATE TABLE t
    (
        c1 VARCHAR(20) CHARACTER SET utf8,
        c2 TEXT CHARACTER SET latin1 COLLATE latin1_general_cs
    );
    

    此表定义创建一个名为c1有一个字符集utf8使用该字符集的默认排序规则,以及名为c2有一个字符集拉丁语1和区分大小写的 (_cs) 整理。

    当其中一个或两个时分配字符集和排序规则的规则字符集整理属性缺失在第 10.3.5 节,“列字符集和排序规则”.

    字符集是同义词字符集.

  • 指定字符集二进制字符串数据类型的属性导致将列创建为相应的二进制字符串数据类型:字符变成二进制, VARCHAR变成变量, 和文本变成斑点.为了枚举数据类型,这不会发生;它们是按声明创建的。假设您使用此定义指定一个表:

    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 扩展,它是指定二进制文件 (_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.0 中,这种非标准的使用二进制属性不明确,因为utf8mb4字符集有多个_bin排序规则。从 MySQL 8.0.17 开始,二进制属性已被弃用,您应该期望在未来版本的 MySQL 中删除对它的支持。应调整应用程序以使用显式_bin而是整理。

    指某东西的用途二进制指定数据类型或字符集保持不变。

  • ASCII属性是简写字符集 latin1.在较旧的 MySQL 版本中受支持,ASCII在 MySQL 8.0.28 及更高版本中已弃用;采用字符集反而。

  • 统一码属性是简写字符集 ucs2.在较旧的 MySQL 版本中受支持,统一码在 MySQL 8.0.28 及更高版本中已弃用;采用字符集反而。

    字符列比较和排序基于分配给列的排序规则。为了字符,VARCHAR,文本,枚举, 和数据类型,您可以使用二进制 (_bin)整理还是二进制的属性使比较和排序使用底层字符代码值,而不是词法排序。

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

  • [国家]字符[(*M*)][字符集]*charset_名称*][整理]*排序规则名称*]

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

    笔记

    烧焦除非PAD_CHAR_至_全长SQL模式已启用。

    烧焦性格. 全国字符(或其等效的缩写形式,恩查尔)是定义烧焦列应该使用一些预定义的字符集。MySQL使用utf8作为这个预定义的字符集。第10.3.7节,“民族性格集”.

    这个字符字节数据类型是二进制的数据类型。这是一个兼容性功能。

    MySQL允许您创建类型为字符(0)。这主要在您必须兼容依赖于列的存在但实际上没有使用其值的旧应用程序时有用。字符(0)当您需要一个只能接受两个值的列时,它也非常好:一个定义为CHAR(0)NULL只占用一位,只能获取值无效的''(空字符串)。

  • [国家]瓦尔查尔(*M*)[字符集]*charset_名称*][整理]*排序规则名称*]

    长度可变的字符串。*M表示最大列长度(以字符为单位)。范围M*是0到65535。一条直线的有效最大长度瓦尔查尔取决于最大行大小(65535字节,在所有列中共享)和使用的字符集。例如utf8每个字符最多需要三个字节,因此瓦尔查尔使用utf8字符集最多可以声明为21844个字符。看见第8.4.7节,“表列计数和行大小的限制”.

    MySQL商店瓦尔查尔值作为1字节或2字节长度前缀加上数据。长度前缀表示值中的字节数。A.瓦尔查尔如果值不需要超过255字节,则列使用一个长度字节;如果值可能需要超过255字节,则列使用两个长度字节。

    笔记

    MySQL遵循标准SQL规范,并且从中删除尾随空格瓦尔查尔价值观

    瓦尔查尔性格多变. 国家瓦查尔酒店是定义瓦尔查尔列应该使用一些预定义的字符集。MySQL使用utf8作为这个预定义的字符集。第10.3.7节,“民族性格集”. 女巫国家瓦查尔酒店.

  • 二进制的[(*M*)]

    这个二进制的类型与烧焦类型,但存储二进制字节字符串,而不是非二进制字符串。可选长度*M表示以字节为单位的列长度。如果省略,*默认为 1。

  • 变量(**)

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

  • 小斑点

    一种斑点最大长度为 255 的列(28− 1) 字节。每个小斑点value 使用 1 字节长度前缀存储,该前缀指示 value 中的字节数。

  • TINYTEXT [字符集 *字符集名称*] [整理*collat​​ion_name*]

    一种文本最大长度为 255 的列(28− 1) 字符。如果值包含多字节字符,则有效最大长度会更小。每个小文本value 使用 1 字节长度前缀存储,该前缀指示 value 中的字节数。

  • 斑点[(**)]

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

    可选长度*可以给这种类型。如果这样做了,MySQL 会将列创建为最小的列斑点键入足够大以容纳值*字节长。

  • 文本[(**)] [字符集 *字符集名称*] [整理*collat​​ion_name*]

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

    可选长度*可以给这种类型。如果这样做了,MySQL 会将列创建为最小的列文本键入足够大以容纳值*长字符。

  • 中块

    一种斑点最大长度为 16,777,215 的列(224− 1) 字节。每个中块value 使用 3 字节长度前缀存储,该前缀指示 value 中的字节数。

  • 中文本 [字符集 *字符集名称*] [整理*collat​​ion_name*]

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

  • 长块

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

  • 长文本 [字符集 *字符集名称*] [整理*collat​​ion_name*]

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

  • 枚举('*价值1*','*价值2*',...) [字符集 *字符集名称*] [整理*collat​​ion_name*]

    一个枚举。一个只能有一个值的字符串对象,从值列表中选择'*价值1*','*价值2*',...,空值或特殊的''错误值。枚举值在内部表示为整数。

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

    个人最大支持长度枚举元素是*\<= 255 和 (xw) \<= 1020, 其中是元素文字长度和w*是字符集中最大长度字符所需的字节数。

  • 放('*价值1*','*价值2*',...) [字符集 *字符集名称*] [整理*collat​​ion_name*]

    一套。可以有零个或多个值的字符串对象,每个值都必须从值列表中选择'*价值1*','*价值2*',... 值在内部表示为整数。

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

    个人最大支持长度元素是*\<= 255 和 (* x w) \<= 1020, 其中是元素文字长度和*w*是字符集中最大长度字符所需的字节数。