### 13.2.7 加载数据语句

[](<>)[](<>)

```
LOAD DATA
    [LOW_PRIORITY | CONCURRENT] [LOCAL]
    INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var
        [, col_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT}
        [, col_name={expr | DEFAULT}] ...]
```

这[`加载数据`](load-data.html)语句以非常高的速度将文本文件中的行读入表中。该文件可以从服务器主机或客户端主机读取，具体取决于是否`当地的`给出了修饰符。`当地的`也影响数据解释和错误处理。

[`加载数据`](load-data.html)是的补码[`选择...进入文件`](select-into.html).（看[第 13.2.10.1 节，“SELECT ... INTO 语句”](select-into.html).) 要将数据从表写入文件，请使用[`选择...进入文件`](select-into.html).要将文件读回表中，请使用[`加载数据`](load-data.html).的语法`领域`和`线`两个语句的子句相同。

[](<>)

这[**mysql导入**](mysqlimport.html)实用程序提供了另一种加载数据文件的方法；它通过发送一个[`加载数据`](load-data.html)向服务器声明。看[第 4.5.5 节，“mysqlimport - 数据导入程序”](mysqlimport.html).

有关效率的信息[`插入`](insert.html)相对[`加载数据`](load-data.html)并加速[`加载数据`](load-data.html)， 看[第 8.2.5.1 节，“优化 INSERT 语句”](insert-optimization.html).

-   [非本地与本地操作](load-data.html#load-data-local)

-   [输入文件字符集](load-data.html#load-data-character-set)

-   [输入文件位置](load-data.html#load-data-file-location)

-   [安全要求](load-data.html#load-data-security-requirements)

-   [重复键和错误处理](load-data.html#load-data-error-handling)

-   [索引处理](load-data.html#load-data-index-handling)

-   [现场和线路处理](load-data.html#load-data-field-line-handling)

-   [列列表规范](load-data.html#load-data-column-list)

-   [输入预处理](load-data.html#load-data-input-preprocessing)

-   [列值分配](load-data.html#load-data-column-assignments)

-   [分区表支持](load-data.html#load-data-partitioning-support)

-   [并发注意事项](load-data.html#load-data-concurrency)

-   [报表结果信息](load-data.html#load-data-statement-result-information)

-   [复制注意事项](load-data.html#load-data-replication)

-   [杂项主题](load-data.html#load-data-miscellaneous)

#### 非本地与本地操作

这`当地的`修饰符影响这些方面[`加载数据`](load-data.html)，相比非`当地的`手术：

-   它改变了输入文件的预期位置；看[输入文件位置](load-data.html#load-data-file-location).

-   它改变了语句的安全要求；看[安全要求](load-data.html#load-data-security-requirements).

-   它的效果与`忽视`对输入文件内容的解释和错误处理的修饰符；看[重复键和错误处理](load-data.html#load-data-error-handling)， 和[列值分配](load-data.html#load-data-column-assignments).

`当地的`仅当服务器和您的客户端都已配置为允许它时才有效。例如，如果[**mysqld**](mysqld.html)开始于[`local_infile`](server-system-variables.html#sysvar_local_infile)系统变量禁用，`当地的`产生错误。看[第 6.1.6 节，“本地加载数据的安全注意事项”](load-data-local-security.html).

#### 输入文件字符集

文件名必须以文字字符串的形式给出。在 Windows 上，将路径名中的反斜杠指定为正斜杠或双反斜杠。服务器使用由[`字符集文件系统`](server-system-variables.html#sysvar_character_set_filesystem)系统变量。

默认情况下，服务器使用由[`字符集数据库`](server-system-variables.html#sysvar_character_set_database)系统变量。如果文件内容使用不同于此默认值的字符集，最好使用`字符集`条款。一个字符集`二进制`指定“无转换”。

[`设置名称`](set-names.html)和设置[`character_set_client`](server-system-variables.html#sysvar_character_set_client)不影响文件内容的解释。

[`加载数据`](load-data.html)将文件中的所有字段解释为具有相同的字符集，而不考虑加载字段值的列的数据类型。为了正确解释文件，您必须确保它是使用正确的字符集编写的。例如，如果您编写一个数据文件[**mysqldump -T**](mysqldump.html)或通过发出[`选择...进入文件`](select-into.html)中的声明[**mysql**](mysql.html)，请务必使用[`--默认字符集`](mysql-command-options.html#option_mysql_default-character-set)选项以在加载文件时使用的字符集中写入输出[`加载数据`](load-data.html).

笔记

无法加载使用`ucs2`,`utf16`,`utf16le`， 要么`utf32`字符集。

#### 输入文件位置

这些规则决定了[`加载数据`](load-data.html)输入文件位置：

-   如果`当地的`未指定，该文件必须位于服务器主机上。服务器直接读取文件，定位如下：

    -   如果文件名是绝对路径名，则服务器按给定的方式使用它。

    -   如果文件名是带有前导组件的相对路径名，则服务器会查找相对于其数据目录的文件。

    -   如果文件名没有前导组件，则服务器在默认数据库的数据库目录中查找该文件。

-   如果`当地的`指定时，文件必须位于客户端主机上。客户端程序读取文件，定位如下：

    -   如果文件名是绝对路径名，则客户端程序按给定的方式使用它。

    -   如果文件名是相对路径名，则客户端程序查找相对于其调用目录的文件。

        什么时候`当地的`使用时，客户端程序读取文件并将其内容发送到服务器。服务器在存储临时文件的目录中创建文件的副本。看[第 B.3.3.5 节，“MySQL 存储临时文件的位置”](temporary-files.html).此目录中的副本空间不足可能会导致[`本地加载数据`](load-data.html)声明失败。

    非`当地的`规则意味着服务器读取一个名为`./myfile.txt`相对于它的数据目录，而它读取一个名为`我的文件.txt`从默认数据库的数据库目录。例如，如果以下[`加载数据`](load-data.html)语句在执行时`db1`是默认数据库，服务器读取文件`数据.txt`从数据库目录中`db1`，即使该语句显式地将文件加载到`数据库2`数据库：


```
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
```

笔记

服务器还使用非`当地的`定位规则`.sdi`文件为[`导入表`](import-table.html)陈述。

#### 安全要求

对于一个非`当地的`加载操作时，服务器读取位于服务器主机上的文本文件，因此必须满足以下安全要求：

-   你必须拥有[`文件`](privileges-provided.html#priv_file)特权。看[第 6.2.2 节，“MySQL 提供的权限”](privileges-provided.html).

-   该操作受[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)系统变量设置：

    -   如果变量值是非空目录名，则文件必须位于该目录中。

    -   如果变量值是空的（这是不安全的），文件只需要被服务器读取。

    为一个`当地的`加载操作时，客户端程序读取位于客户端主机上的文本文件。因为文件内容是由客户端通过连接发送到服务器的，所以使用`当地的`比服务器直接访问文件时要慢一些。另一方面，您不需要[`文件`](privileges-provided.html#priv_file)权限，并且该文件可以位于客户端程序可以访问的任何目录中。

#### 重复键和错误处理

这`代替`和`忽视`修饰符控制对在唯一键值上重复现有表行的新（输入）行的处理（`首要的关键`要么`独特`指数值）：

[](<>)[](<>)

-   和`代替`，与现有行中的唯一键值具有相同值的新行替换现有行。看[第 13.2.9 节，“REPLACE 语句”](replace.html).

-   和`忽视`，与唯一键值上的现有行重复的新行将被丢弃。有关详细信息，请参阅[IGNORE 对语句执行的影响](sql-mode.html#ignore-effect-on-execution).

    这`当地的`修饰符具有相同的效果`忽视`.这是因为服务器无法在操作过程中停止文件传输。

    如果没有`代替`,`忽视`， 要么`当地的`指定，则在找到重复键值时发生错误，并忽略文本文件的其余部分。

    除了影响刚才描述的重复键处理之外，`忽视`和`当地的`也会影响错误处理：

-   两者都没有`忽视`也不`当地的`，数据解释错误终止操作。

-   和`忽视`要么`当地的`，数据解释错误变成警告并且加载操作继续，即使 SQL 模式是限制性的。例如，请参阅[列值分配](load-data.html#load-data-column-assignments).

#### 索引处理

要在加载操作期间忽略外键约束，请执行`SET foreign_key_checks = 0`执行前的声明[`加载数据`](load-data.html).

如果你使用[`加载数据`](load-data.html)在一个空`MyISAM`表中，所有非唯一索引都在单独的批次中创建（如[`维修台`](repair-table.html)）。通常，这使得[`加载数据`](load-data.html)当你有很多索引时要快得多。在某些极端情况下，您可以通过关闭索引来更快地创建索引[`ALTER TABLE ... 禁用键`](alter-table.html)在将文件加载到表中并重新创建索引之前[`ALTER TABLE ...启用键`](alter-table.html)加载文件后。看[第 8.2.5.1 节，“优化 INSERT 语句”](insert-optimization.html).

#### 现场和线路处理

对于两者[`加载数据`](load-data.html)和[`选择...进入文件`](select-into.html)语句，的语法`领域`和`线`条款是一样的。这两个子句都是可选的，但`领域`必须先于`线`如果两者都指定。

如果您指定一个`领域`子句，其每个子句 (`终止于`,`[可选地] 包含在`， 和`逃脱`) 也是可选的，但您必须至少指定其中一个。这些子句的参数只允许包含 ASCII 字符。

如果您指定否`领域`要么`线`子句，默认值与您编写的相同：

```
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''
```

反斜杠是 SQL 语句中字符串中的 MySQL 转义字符。因此，要指定文字反斜杠，您必须指定两个反斜杠以将值解释为单个反斜杠。转义序列`'\t'`和`'\n'`分别指定制表符和换行符。

换句话说，默认值导致[`加载数据`](load-data.html)在读取输入时执行以下操作：

-   在换行符处查找行边界。

-   不要跳过任何行前缀。

-   在制表符处将行拆分为字段。

-   不要期望字段包含在任何引用字符中。

-   解释转义字符前面的字符`\`作为转义序列。例如，`\t`,`\n`， 和`\\`分别表示制表符、换行符和反斜杠。见讨论`逃脱的领域`稍后查看转义序列的完整列表。

    相反，默认值会导致[`选择...进入文件`](select-into.html)写入输出时执行以下操作：

-   在字段之间写入标签。

-   不要将字段括在任何引用字符中。

-   采用`\`转义制表符、换行符或`\`发生在字段值中。

-   在行尾写下换行符。

笔记

对于在 Windows 系统上生成的文本文件，可能需要正确读取文件`以“\r\n”结尾的行`因为 Windows 程序通常使用两个字符作为行终止符。一些程序，例如**写字板**, 可能使用`\r`写入文件时作为行终止符。要读取此类文件，请使用`以“\r”结尾的行`.

如果所有输入行都有一个您想忽略的公共前缀，您可以使用`以 '* 开头的行`前缀字符串`*'`跳过前缀*以及之前的任何事情*.如果一行不包含前缀，则跳过整行。假设您发出以下语句：

```
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test
  FIELDS TERMINATED BY ','  LINES STARTING BY 'xxx';
```

如果数据文件如下所示：

```
xxx"abc",1
something xxx"def",2
"ghi",3
```

结果行是`("abc",1)`和`（“定义”，2）`.文件中的第三行被跳过，因为它不包含前缀。

这`忽视 *`数字`* 线`子句可用于忽略文件开头的行。例如，您可以使用`忽略 1 行`跳过包含列名的初始标题行：

```
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
```

当你使用[`选择...进入文件`](select-into.html)与[`加载数据`](load-data.html)要将数据库中的数据写入文件，然后稍后将文件读回数据库，两个语句的字段和行处理选项必须匹配。否则，[`加载数据`](load-data.html)没有正确解释文件的内容。假设您使用[`选择...进入文件`](select-into.html)编写一个以逗号分隔的字段的文件：

```
SELECT * INTO OUTFILE 'data.txt'
  FIELDS TERMINATED BY ','
  FROM table2;
```

要读取逗号分隔的文件，正确的说法是：

```
LOAD DATA INFILE 'data.txt' INTO TABLE table2
  FIELDS TERMINATED BY ',';
```

相反，如果您尝试使用以下显示的语句读取文件，它将无法工作，因为它指示[`加载数据`](load-data.html)查找字段之间的选项卡：

```
LOAD DATA INFILE 'data.txt' INTO TABLE table2
  FIELDS TERMINATED BY '\t';
```

可能的结果是每个输入行将被解释为单个字段。

[](<>)[](<>)

[`加载数据`](load-data.html)可用于读取从外部来源获得的文件。例如，许多程序可以以逗号分隔值 (CSV) 格式导出数据，这样行的字段由逗号分隔并用双引号括起来，并带有列名的初始行。如果此类文件中的行以回车符/换行符对终止，则此处显示的语句说明了用于加载文件的字段和行处理选项：

```
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'
  IGNORE 1 LINES;
```

如果输入值不一定用引号括起来，请使用`可选地`之前`附于`选项。

任何字段或行处理选项都可以指定一个空字符串 (`''`）。如果不为空，则`字段 [可选地] 由`和`逃脱的领域`值必须是单个字符。这`终止于的字段`,`开始的线路`， 和`线路终止于`值可以是多个字符。例如，要写入以回车/换行对终止的行，或读取包含此类行的文件，请指定`以“\r\n”结尾的行`条款。

读取包含由以下行分隔的笑话的文件`%%`， 你可以这样做

```
CREATE TABLE jokes
  (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  joke TEXT NOT NULL);
LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes
  FIELDS TERMINATED BY ''
  LINES TERMINATED BY '\n%%\n' (joke);
```

`字段 [可选地] 由`控制字段的引用。对于输出（[`选择...进入文件`](select-into.html))，如果你省略了这个词`可选地`，所有字段都由`附于`特点。此处显示了此类输出的示例（使用逗号作为字段分隔符）：

```
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
```

如果您指定`可选地`， 这`附于`字符仅用于包含具有字符串数据类型的列中的值（例如[`字符`](char.html),[`二进制`](binary-varbinary.html),[`文本`](blob.html)， 要么[`枚举`](enum.html)):

```
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
```

的发生`附于`字段值中的字符通过在它们前面加上前缀来进行转义`逃脱`特点。此外，如果您指定一个空的`逃脱`值，可能会无意中生成无法正确读取的输出[`加载数据`](load-data.html).例如，如果转义字符为空，则刚刚显示的上述输出将如下所示。请注意，第四行中的第二个字段在引号后面包含一个逗号，这（错误地）似乎终止了该字段：

```
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
```

对于输入，`附于`字符（如果存在）从字段值的末尾剥离。（无论是否`可选地`已指明；`可选地`对输入解释没有影响。）`附于`前面的字符`逃脱`字符被解释为当前字段值的一部分。

如果该字段以`附于`字符，该字符的实例仅在后跟字段或行时才被识别为终止字段值`终止于`顺序。为避免歧义，出现`附于`字段值中的字符可以加倍并被解释为字符的单个实例。例如，如果`由'"'包围`已指定，引号的处理如下所示：

```
"The ""BIG"" boss"  -> The "BIG" boss
The "BIG" boss      -> The "BIG" boss
The ""BIG"" boss    -> The ""BIG"" boss
```

`逃脱的领域`控制如何读取或写入特殊字符：

-   对于输入，如果`逃脱的领域`字符不为空，该字符的出现将被剥离，随后的字符被视为字段值的一部分。一些例外的两个字符序列，其中第一个字符是转义字符。这些序列如下表所示（使用`\`对于转义字符）。规则为`空值`处理将在本节后面介绍。

    | 特点 | 转义序列 |
    | --- | ---- |
    | `\0`[](<>)[](<>) | 一个 ASCII NUL (`X'00'`） 特点 |
    | `\b`[](<>)[](<>) | 退格字符 |
    | `\n`[](<>)[](<>)[](<>)[](<>) | 换行符（换行符） |
    | `\r`[](<>)[](<>)[](<>) | 回车符 |
    | `\t`[](<>)[](<>) | 制表符。 |
    | `\Z`[](<>)[](<>) | ASCII 26（控制+Z） |
    | `\N`[](<>) | 空值 |

    有关更多信息`\`-转义语法，请参阅[第 9.1.1 节，“字符串文字”](string-literals.html).

    如果`逃脱的领域`字符为空，不发生转义序列解释。

-   对于输出，如果`逃脱的领域`字符不为空，它用于在输出中为以下字符添加前缀：

    -   这`逃脱的领域`特点。

    -   这`字段 [可选地] 由`特点。

    -   的第一个字符`终止于的字段`和`线路终止于`值，如果`附于`字符为空或未指定。

    -   ASCII`0`（实际上在转义字符后面写的是 ASCII`0`，而不是零值字节）。

        如果`逃脱的领域`字符为空，没有字符被转义并且`空值`输出为`空值`， 不是`\N`.指定一个空的转义字符可能不是一个好主意，尤其是当数据中的字段值包含刚刚给出的列表中的任何字符时。

    在某些情况下，字段和线路处理选项相互作用：

-   如果`线路终止于`是一个空字符串并且`终止于的字段`是非空的，行也以`终止于的字段`.

-   如果`终止于的字段`和`包围的领域`值都是空的（`''`)，使用固定行（非定界）格式。使用固定行格式，字段之间不使用分隔符（但您仍然可以使用行终止符）。相反，使用足够宽的字段宽度来读取和写入列值以容纳字段中的所有值。为了[`小音`](integer-types.html),[`小灵通`](integer-types.html),[`中型`](integer-types.html),[`INT`](integer-types.html)， 和[`大整数`](integer-types.html)，无论声明的显示宽度是多少，字段宽度分别为 4、6、8、11 和 20。

     `线路终止于`仍然用于分隔行。如果一行不包含所有字段，则其余列将设置为其默认值。如果您没有行终止符，则应将其设置为`''`.在这种情况下，文本文件必须包含每一行的所有字段。

    固定行格式也会影响处理`空值`值，如后所述。

    笔记

    如果您使用多字节字符集，则固定大小格式不起作用。

    处理`空值`值根据`领域`和`线`使用中的选项：

-   对于默认`领域`和`线`价值观，`空值`被写为字段值`\N`用于输出，字段值为`\N`读作`空值`对于输入（假设`逃脱`字符是`\`）。

-   如果`包围的领域`不为空，包含字面量的字段`空值`因为它的值被读取为`空值`价值。这与单词不同`空值`封闭在`包围的领域`字符，读取为字符串`'空值'`.

-   如果`逃脱的领域`是空的，`空值`写成这个词`空值`.

-   使用固定行格式（当`终止于的字段`和`包围的领域`都是空的），`空值`写为空字符串。这导致两者`空值`表中的值和空字符串在写入文件时无法区分，因为两者都写为空字符串。如果在读回文件时需要能够区分两者，则不应使用固定行格式。

    尝试加载`空值`成一个`非空`列根据中描述的规则产生警告或错误[列值分配](load-data.html#load-data-column-assignments).

    有些情况不支持[`加载数据`](load-data.html)：

-   固定大小的行 (`终止于的字段`和`包围的领域`都是空的）和[`斑点`](blob.html)要么[`文本`](blob.html)列。

-   如果您指定一个与另一个相同或前缀的分隔符，[`加载数据`](load-data.html)无法正确解释输入。例如，以下`领域`子句会导致问题：

    ```
    FIELDS TERMINATED BY '"' ENCLOSED BY '"'
    ```

-   如果`逃脱的领域`为空，字段值包含一个`包围的领域`要么`线路终止于`其次是`终止于的字段`价值原因[`加载数据`](load-data.html)过早停止读取字段或行。发生这种情况是因为[`加载数据`](load-data.html)无法正确确定字段或行值的结束位置。

#### 列列表规范

以下示例加载`个人资料`桌子：

```
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
```

默认情况下，当末尾没有提供列列表时[`加载数据`](load-data.html)语句，输入行应包含每个表列的字段。如果您只想加载表的某些列，请指定列列表：

```
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata
(col_name_or_user_var [, col_name_or_user_var] ...);
```

如果输入文件中字段的顺序与表中列的顺序不同，您还必须指定列列表。否则，MySQL 无法判断如何将输入字段与表列匹配。

#### 输入预处理

每个实例*`col_name_or_user_var`*在[`加载数据`](load-data.html)语法是列名或用户变量。使用用户变量，`放`子句使您能够在将结果分配给列之前对其值执行预处理转换。

用户变量在`放`子句可以以多种方式使用。以下示例直接使用第一个输入列作为`t1.column1`, 并将第二个输入列分配给一个用户变量，该用户变量在用于`t1.column2`：

```
LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, @var1)
  SET column2 = @var1/100;
```

这`放`子句可用于提供不是从输入文件派生的值。以下语句设置`第 3 列`到当前日期和时间：

```
LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, column2)
  SET column3 = CURRENT_TIMESTAMP;
```

您还可以通过将输入值分配给用户变量而不将变量分配给任何表列来丢弃输入值：

```
LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, @dummy, column2, @dummy, column3);
```

使用列/变量列表和`放`条款受以下限制：

-   中的作业`放`子句应该只有赋值运算符左侧的列名。

-   您可以在右侧使用子查询`放`作业。返回要分配给列的值的子查询可能只是标量子查询。此外，您不能使用子查询从正在加载的表中进行选择。

-   被忽略的行`忽视 *`数字`* 线`不为列/变量列表处理子句或`放`条款。

-   加载固定行格式的数据时不能使用用户变量，因为用户变量没有显示宽度。

#### 列值分配

要处理输入行，[`加载数据`](load-data.html)将其拆分为字段并根据列/变量列表和`放`子句，如果它们存在。然后将结果行插入到表中。如果有`插入前`要么`插入后`表的触发器，它们分别在插入行之前或之后被激活。

字段值的解释和表列的分配取决于以下因素：

-   SQL模式（的值[`sql_mode`](server-system-variables.html#sysvar_sql_mode)系统变量）。该模式可以是非限制性的，或以各种方式限制性的。例如，可以启用严格的 SQL 模式，或者该模式可以包含诸如[`NO_ZERO_DATE`](sql-mode.html#sqlmode_no_zero_date)要么[`NO_ZERO_IN_DATE`](sql-mode.html#sqlmode_no_zero_in_date).

-   存在或不存在`忽视`和`当地的`修饰符。

    这些因素结合起来产生限制性或非限制性的数据解释[`加载数据`](load-data.html)：

-   如果 SQL 模式是限制性的，并且`忽视`也不是`当地的`修饰符被指定。错误会终止加载操作。

-   如果 SQL 模式是非限制性的或`忽视`要么`当地的`修饰符被指定。（特别是，如果指定了任一修饰符*覆盖*限制性 SQL 模式。）错误变成警告，加载操作继续。

    限制性数据解释使用以下规则：

-   字段过多或过少都会导致错误。

-   分配`空值`（那是，`\N`) 到非`空值`列导致错误。

-   超出列数据类型范围的值会导致错误。

-   无效值会产生错误。例如，一个值，如`'x'`对于数字列会导致错误，而不是转换为 0。

    相比之下，非限制性数据解释使用以下规则：

-   如果输入行的字段过多，则会忽略多余的字段并增加警告的数量。

-   如果输入行的字段太少，则会为缺少输入字段的列分配其默认值。默认值分配在[第 11.6 节，“数据类型默认值”](data-type-defaults.html).

-   分配`空值`（那是，`\N`) 到非`空值`列导致为列数据类型分配隐式默认值。隐式默认值在[第 11.6 节，“数据类型默认值”](data-type-defaults.html).

-   无效值会产生警告而不是错误，并转换为列数据类型的“最接近”的有效值。例子：

    -   一个值，例如`'x'`对于数字列会导致转换为 0。

    -   超出范围的数值或时间值将被剪裁到列数据类型范围的最近端点。

    -   a 的值无效`约会时间`,`日期`， 要么`时间`列作为隐式默认值插入，与 SQL 模式无关[`NO_ZERO_DATE`](sql-mode.html#sqlmode_no_zero_date)环境。隐式默认值是类型的适当“零”值 (`'0000-00-00 00:00:00'`,`'0000-00-00'`， 要么`'00:00:00'`）。看[第 11.2 节，“日期和时间数据类型”](date-and-time-types.html).

-   [`加载数据`](load-data.html)对空字段值的解释与缺失字段不同：

    -   对于字符串类型，该列设置为空字符串。

    -   对于数字类型，该列设置为`0`.

    -   对于日期和时间类型，该列设置为该类型的适当“零”值。看[第 11.2 节，“日期和时间数据类型”](date-and-time-types.html).

        如果您将空字符串显式分配给字符串、数字或日期或时间类型[`插入`](insert.html)要么[`更新`](update.html)陈述。

[`时间戳`](datetime.html)仅当存在`空值`列的值（即`\N`) 并且该列未声明为允许`空值`值，或者如果[`时间戳`](datetime.html)列默认值是当前时间戳，当指定字段列表时，它会从字段列表中省略。

[`加载数据`](load-data.html)将所有输入视为字符串，因此您不能将数值用于[`枚举`](enum.html)要么[`放`](set.html)列您可以使用的方式[`插入`](insert.html)陈述。全部[`枚举`](enum.html)和[`放`](set.html)值必须指定为字符串。

[`少量`](bit-type.html)不能使用二进制符号直接加载值（例如，`b'011010'`）。要解决此问题，请使用`放`去掉前导的条款`b'`和尾随`'`并执行 base-2 到 base-10 的转换，以便 MySQL 将值加载到[`少量`](bit-type.html)列正确：

```
$> cat /tmp/bit_test.txt
b'10'
b'1111111'
$> mysql test
mysql> LOAD DATA INFILE '/tmp/bit_test.txt'
       INTO TABLE bit_test (@var1)
       SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-3), 2, 10) AS UNSIGNED);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT BIN(b+0) FROM bit_test;
+----------+
| BIN(b+0) |
+----------+
| 10       |
| 1111111  |
+----------+
2 rows in set (0.00 sec)
```

为了[`少量`](bit-type.html)中的值`0b`二进制表示法（例如，`0b011010`）， 用这个`放`子句改为剥离前导`0b`：

```
SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-2), 2, 10) AS UNSIGNED)
```

#### 分区表支持

[`加载数据`](load-data.html)支持使用显式分区选择`划分`带有一个或多个以逗号分隔的分区、子分区或两者名称的列表的子句。使用此子句时，如果文件中的任何行无法插入到列表中指定的任何分区或子分区中，则语句将失败，并出现错误 Found a row not matching the given partition set。有关更多信息和示例，请参阅[第 24.5 节，“分区选择”](partitioning-selection.html).

#### 并发注意事项

随着`低优先级`修改器，执行[`加载数据`](load-data.html)语句被延迟，直到没有其他客户端从表中读取。这仅影响仅使用表级锁定的存储引擎（例如`MyISAM`,`记忆`， 和`合并`）。

随着`同时`修饰符和一个`MyISAM`满足并发插入条件的表（即中间不包含空闲块），其他线程可以从表中取数据，同时[`加载数据`](load-data.html)正在执行。该修饰符影响性能[`加载数据`](load-data.html)有点，即使没有其他线程同时使用该表。

#### 报表结果信息

当。。。的时候[`加载数据`](load-data.html)语句完成后，它返回以下格式的信息字符串：

```
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0
```

在与使用[`插入`](insert.html)声明（见[第 13.2.6 节，“INSERT 语句”](insert.html)）， 除了那个[`加载数据`](load-data.html)当输入行中的字段太少或太多时，也会生成警告。

您可以使用[`显示警告`](show-warnings.html)获取第一个列表[`最大错误计数`](server-system-variables.html#sysvar_max_error_count)警告作为有关出了什么问题的信息。看[第 13.7.7.42 节，“显示警告声明”](show-warnings.html).

[](<>)

如果您使用的是 C API，您可以通过调用[`mysql_info()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-info.html)功能。看[mysql\_信息（）](https://dev.mysql.com/doc/c-api/8.0/en/mysql-info.html).

#### 复制注意事项

[`加载数据`](load-data.html)对于基于语句的复制被认为是不安全的。如果你使用[`加载数据`](load-data.html)和[`binlog_format=声明`](replication-options-binary-log.html#sysvar_binlog_format)，要应用更改的每个副本都会创建一个包含数据的临时文件。此临时文件未加密，即使源上的二进制日志加密处于活动状态，如果需要加密，请改用基于行或混合二进制日志格式，副本不会为其创建临时文件。欲了解更多关于它们之间的相互作用的信息[`加载数据`](load-data.html)和复制，见[第 17.5.1.19 节，“复制和加载数据”](replication-features-load-data.html).

#### 杂项主题

在 Unix 上，如果你需要[`加载数据`](load-data.html)要从管道中读取，您可以使用以下技术（示例加载`/`目录到表中`db1.t1`):

```
mkfifo /mysql/data/db1/ls.dat
chmod 666 /mysql/data/db1/ls.dat
find / -ls > /mysql/data/db1/ls.dat &
mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE t1" db1
```

在这里，您必须运行生成要加载的数据的命令和[**mysql**](mysql.html)命令可以在单独的终端上执行，也可以在后台运行数据生成过程（如前面的示例所示）。如果不这样做，管道会阻塞，直到数据被[**mysql**](mysql.html)过程。
