string-type-syntax.md 11.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
### 11.3.1 字符串数据类型语法

字符串数据类型是[`字符`](char.html),[`VARCHAR`](char.html),[`二进制`](binary-varbinary.html),[`变量`](binary-varbinary.html),[`斑点`](blob.html),[`文本`](blob.html),[`枚举`](enum.html), 和[`放`](set.html).

在某些情况下,MySQL 可能会将字符串列更改为不同于[`创建表`](create-table.html)要么[`更改表`](alter-table.html)陈述。看[第 13.1.20.7 节,“静默列规范更改”](silent-column-changes.html).

对于字符串列的定义([`字符`](char.html),[`VARCHAR`](char.html), 和[`文本`](blob.html)types),MySQL以字符单位解释长度规范。对于二进制字符串列的定义([`二进制`](binary-varbinary.html),[`变量`](binary-varbinary.html), 和[`斑点`](blob.html)types),MySQL以字节为单位解释长度规范。

字符串数据类型的列定义[`字符`](char.html),[`VARCHAR`](char.html), 这[`文本`](blob.html)类型,[`枚举`](enum.html),[`放`](set.html), 和任何同义词)可以指定列字符集和排序规则:

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

    ```
    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 节,“列字符集和排序规则”](charset-column.html).

    `字符集`是同义词`字符集`.

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

    ```
    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 及更高版本中已弃用;采用`字符集`反而。

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

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

-   [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) `[国家]字符[(*`M`*)][字符集]*`charset\_名称`*][整理]*`排序规则名称`*]`

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

    [](<>)

    笔记

    当[`烧焦`](char.html)除非[`PAD_CHAR_至_全长`](sql-mode.html#sqlmode_pad_char_to_full_length)SQL模式已启用。

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

    这个[`字符字节`](binary-varbinary.html)数据类型是[`二进制的`](binary-varbinary.html)数据类型。这是一个兼容性功能。

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

-   [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) `[国家]瓦尔查尔(*`M`*)[字符集]*`charset\_名称`*][整理]*`排序规则名称`*]`

    [](<>)

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

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

    笔记

    MySQL遵循标准SQL规范,并且*不*从中删除尾随空格[`瓦尔查尔`](char.html)价值观

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

-   [](<>) [](<>) [`二进制的[(*`M`*)]`](binary-varbinary.html)

    这个[`二进制的`](binary-varbinary.html)类型与[`烧焦`](char.html)类型,但存储二进制字节字符串,而不是非二进制字符串。可选长度*`M`*表示以字节为单位的列长度。如果省略,*`米`*默认为 1。

-   [](<>) [](<>) [`变量(*`米`*)`](binary-varbinary.html)

    这[`变量`](binary-varbinary.html)类型类似于[`VARCHAR`](char.html)类型,但存储二进制字节字符串而不是非二进制字符串。*`米`*表示以字节为单位的最大列长度。

-   [](<>) [](<>) [`小斑点`](blob.html)

    一种[`斑点`](blob.html)最大长度为 255 的列(2<sup>8</sup>− 1) 字节。每个[`小斑点`](blob.html)value 使用 1 字节长度前缀存储,该前缀指示 value 中的字节数。

-   [](<>) [](<>) [`TINYTEXT [字符集 *`字符集名称`*] [整理*`collat​​ion_name`*]`](blob.html)

    一种[`文本`](blob.html)最大长度为 255 的列(2<sup>8</sup>− 1) 字符。如果值包含多字节字符,则有效最大长度会更小。每个[`小文本`](blob.html)value 使用 1 字节长度前缀存储,该前缀指示 value 中的字节数。

-   [](<>) [](<>) [`斑点[(*`米`*)]`](blob.html)

    一种[`斑点`](blob.html)最大长度为 65,535 的列(2<sup>16</sup>− 1) 字节。每个[`斑点`](blob.html)value 使用 2 字节长度前缀存储,该前缀指示 value 中的字节数。

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

-   [](<>) [](<>) [`文本[(*`米`*)] [字符集 *`字符集名称`*] [整理*`collat​​ion_name`*]`](blob.html)

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

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

-   [](<>) [](<>) [`中块`](blob.html)

    一种[`斑点`](blob.html)最大长度为 16,777,215 的列(2<sup>24</sup>− 1) 字节。每个[`中块`](blob.html)value 使用 3 字节长度前缀存储,该前缀指示 value 中的字节数。

-   [](<>) [](<>) [`中文本 [字符集 *`字符集名称`*] [整理*`collat​​ion_name`*]`](blob.html)

    一种[`文本`](blob.html)最大长度为 16,777,215 的列(2<sup>24</sup>− 1) 字符。如果值包含多字节字符,则有效最大长度会更小。每个[`中文本`](blob.html)value 使用 3 字节长度前缀存储,该前缀指示 value 中的字节数。

-   [](<>) [](<>) [`长块`](blob.html)

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

-   [](<>) [](<>) [`长文本 [字符集 *`字符集名称`*] [整理*`collat​​ion_name`*]`](blob.html)

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

-   [](<>) [](<>) [`枚举('*`价值1`*','*`价值2`*',...) [字符集 *`字符集名称`*] [整理*`collat​​ion_name`*]`](enum.html)

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

    一个[`枚举`](enum.html)列最多可以有 65,535 个不同的元素。

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

-   [](<>) [](<>) [`放('*`价值1`*','*`价值2`*',...) [字符集 *`字符集名称`*] [整理*`collat​​ion_name`*]`](set.html)

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

    一种[`放`](set.html)列最多可以有 64 个不同的成员。

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