Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  LOAD DATA Statement

15.2.9 LOAD DATA语句

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语句从文本文件中读取行到表中,以非常高的速度。文件可以从服务器主机或客户端主机读取,取决于是否给出了LOCAL修饰符。LOCAL也影响数据解释和错误处理。

LOAD DATASELECT ... INTO OUTFILE的补充。(见第15.2.13.1节,“SELECT ... INTO语句”。)要将数据从表写入文件,请使用SELECT ... INTO OUTFILE。要将文件读回表中,请使用LOAD DATA。这两个语句的FIELDS和LINES子句的语法相同。

mysqlimport实用程序提供了另一种加载数据文件的方法;它通过将LOAD DATA语句发送到服务器来操作。见第6.5.5节,“mysqlimport — 数据导入程序”

关于INSERTLOAD DATA的效率和加速LOAD DATA的信息,请参见第10.2.5.1节,“优化INSERT语句”

非LOCAL与LOCAL操作

LOCAL修饰符影响LOAD DATA的以下方面,与非LOCAL操作相比:

LOCAL仅在服务器和客户端都配置了允许它的情况下生效。例如,如果mysqld以禁用local_infile系统变量启动,LOCAL将产生错误。见第8.1.6节,“LOAD DATA LOCAL的安全考虑”

输入文件字符集

文件名必须作为文字字符串给出。在Windows上,指定路径名中的反斜杠作为正斜杠或双反斜杠。服务器使用character_set_filesystem系统变量指示的字符集来解释文件名。

默认情况下,服务器使用character_set_database系统变量指示的字符集来解释文件内容。如果文件内容使用不同的字符集,可以使用CHARACTER SET子句指定该字符集。binary字符集指定“不进行转换”。

SET NAMEScharacter_set_client的设置不影响文件内容的解释。

LOAD DATA将文件中的所有字段解释为具有相同的字符集,不管加载到的列的数据类型如何。为了正确解释文件,您必须确保文件是使用正确的字符集编写的。例如,如果您使用mysqldump -T或在mysql中发出SELECT ... INTO OUTFILE语句写入数据文件,请确保使用--default-character-set选项将输出写入要使用的字符集,以便在使用LOAD DATA加载文件时正确解释。

Note

无法加载使用ucs2utf16utf16leutf32字符集的数据文件。

输入文件位置

以下规则确定LOAD DATA输入文件位置:

  • 如果未指定LOCAL,文件必须位于服务器主机上。服务器直接读取文件,按照以下方式定位:

    • 如果文件名是一个绝对路径名,服务器使用它作为给定的。

    • 如果文件名是一个相对路径名带有leading组件,服务器在其数据目录中查找文件。

    • 如果文件名没有leading组件,服务器在默认数据库的数据库目录中查找文件。

  • 如果指定了LOCAL,文件必须位于客户端主机上。客户端程序读取文件,按照以下方式定位:

    • 如果文件名是一个绝对路径名,客户端程序使用它作为给定的。

    • 如果文件名是一个相对路径名,客户端程序在其调用目录中查找文件。

    LOCAL 被使用时,客户端程序读取文件并将其内容发送到服务器。服务器在临时文件目录中创建文件的副本。参见 第 B.3.3.5 节,“MySQL 存储临时文件的位置”。如果临时文件目录中没有足够的空间来存储副本,可能会导致 LOAD DATA LOCAL 语句失败。

LOCAL 规则意味着服务器从数据目录中读取名为 ./myfile.txt 的文件,而不是从默认数据库的数据库目录中读取名为 myfile.txt 的文件。例如,如果执行以下 LOAD DATA 语句时,当前数据库为 db1,那么服务器将从 db1 的数据库目录中读取名为 data.txt 的文件,即使语句明确地将文件加载到 db2 数据库中的表中:

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

服务器还使用非 LOCAL 规则来定位 .sdi 文件,以便 IMPORT TABLE 语句。

安全要求

对于非 LOCAL 加载操作,服务器从服务器主机上读取文本文件,因此必须满足以下安全要求:

对于 LOCAL 加载操作,客户端程序从客户端主机上读取文本文件。因为文件内容通过客户端连接发送到服务器,因此使用 LOCAL 比服务器直接访问文件慢一些。另一方面,您不需要 FILE 权限,文件可以位于客户端程序可以访问的任何目录中。

重复键和错误处理

REPLACEIGNORE 修饰符控制新行(输入行)与现有表行在唯一键值(PRIMARY KEYUNIQUE 索引值)上的重复:

LOCAL 修饰符具有与 IGNORE 相同的效果。这是因为服务器无法在操作中止传输文件。

如果未指定 REPLACEIGNORELOCAL,则在找到重复键值时将发生错误,并忽略文本文件的其余部分。

此外,IGNORELOCAL 也影响错误处理:

  • 如果未指定 IGNORELOCAL,数据解释错误将终止操作。

  • 使用 IGNORELOCAL,数据解释错误将变为警告,并且加载操作将继续,即使 SQL 模式是 restrictiv。例如,参见 列值分配

索引处理

要忽略外键约束在加载操作期间,执行 SET foreign_key_checks = 0 语句,然后执行 LOAD DATA

如果您使用 LOAD DATA 在空的 MyISAM 表中,所有非唯一索引将在单独的批处理中创建(与 REPAIR TABLE 相同)。通常,这使得 LOAD DATA 在您有许多索引时变得更快。在某些极端情况下,您可以通过使用 ALTER TABLE ... DISABLE KEYS 在加载文件到表之前禁用索引,然后使用 ALTER TABLE ... ENABLE KEYS 在加载文件后重新创建索引。见 第 10.2.5.1 节,“优化 INSERT 语句”

字段和行处理

对于 LOAD DATASELECT ... INTO OUTFILE 语句,FIELDSLINES 子句的语法相同。两个子句都是可选的,但 FIELDS 必须在 LINES 之前指定。

如果您指定了 FIELDS 子句,每个子子句 (TERMINATED BY[OPTIONALLY] ENCLOSED BYESCAPED BY) 也都是可选的,除了您必须指定至少一个。这些子句的参数只能包含 ASCII 字符。

如果您没有指定 FIELDSLINES 子句,默认值与以下相同:

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

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

换言之,默认值使 LOAD DATA 在读取输入时按照以下方式操作:

  • 在新行处查找行边界。

  • 不跳过任何行前缀。

  • 在制表符处将行分割成字段。

  • 不期望字段被任何引号字符所括起来。

  • 将反斜杠前面的字符解释为转义序列。例如,\t\n\\ 分别表示制表符、换行符和反斜杠。见 FIELDS ESCAPED BY 的讨论以获取完整的转义序列列表。

相反,默认值使 SELECT ... INTO OUTFILE 在写入输出时按照以下方式操作:

  • 在字段之间写入制表符。

  • 不将字段括起来。

  • 使用 \ 转义字段值中的制表符、换行符或 \ 实例。

  • 在行末写入换行符。

Note

对于在 Windows 系统上生成的文本文件,正确的文件读取可能需要 LINES TERMINATED BY '\r\n',因为 Windows 程序通常使用两个字符作为行终止符。某些程序,如 WordPad,可能在写入文件时使用 \r 作为行终止符。要读取这些文件,请使用 LINES TERMINATED BY '\r'

如果所有输入行都有一个公共前缀,您想忽略它,可以使用 LINES STARTING BY 'prefix_string' 跳过前缀 和它之前的任何内容。如果一行不包含前缀,整个行将被跳过。假设您发出以下语句:

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)("def",2)。文件中的第三行将被跳过,因为它不包含前缀。

IGNORE number LINES 子句可以用来忽略文件开头的行。例如,您可以使用 IGNORE 1 LINES 跳过初始标题行,包含列名:

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

当您使用 SELECT ... INTO OUTFILELOAD DATA 一起将数据库中的数据写入文件,然后稍后将文件读回数据库时,两个语句的字段和行处理选项必须匹配。否则,LOAD DATA 不会正确地解释文件的内容。假设您使用 SELECT ... INTO OUTFILE 将文件写入带逗号分隔的字段:

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

要读取逗号分隔的文件,正确的语句是:

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

如果您尝试使用以下语句读取文件,它将不起作用,因为它指示 LOAD DATA 在字段之间查找制表符:

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

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

LOAD DATA 可以用于读取来自外部来源的文件。例如,许多程序可以将数据导出为逗号分隔值(CSV)格式,以便每行字段由逗号分隔,并用双引号括起来,带有初始列名行。如果文件中的行以回车换行对终止,该语句显示了用于加载文件的字段和行处理选项:

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

如果输入值不一定被双引号括起来,请在 ENCLOSED BY 选项前使用 OPTIONALLY

任何字段或行处理选项都可以指定为空字符串('')。如果不为空,FIELDS [OPTIONALLY] ENCLOSED BYFIELDS ESCAPED BY 值必须是一个字符。FIELDS TERMINATED BYLINES STARTING BYLINES TERMINATED BY 值可以是多个字符。例如,要写入以回车换行对终止的行,或者读取包含这些行的文件,请指定 LINES TERMINATED BY '\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);

FIELDS [OPTIONALLY] ENCLOSED BY 控制字段的引用。对于输出(SELECT ... INTO OUTFILE),如果您省略单词 OPTIONALLY,所有字段都将被 ENCLOSED BY 字符括起来。例如,使用逗号作为字段分隔符的输出如下所示:

"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"

如果您指定 OPTIONALLY,则 ENCLOSED BY 字符仅用于括起字符串数据类型(例如 CHARBINARYTEXTENUM)列的值:

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

字段值中的 ENCLOSED BY 字符的出现将被 ESCAPED BY 字符前缀逃逸。此外,如果您指定了空的 ESCAPED BY 值,那么可能会生成无法被 LOAD DATA 正确读取的输出。例如,前面的输出将如下所示,如果 escape 字符为空。请注意,第四行的第二个字段包含一个逗号,后跟引号,这(错误地)似乎终止了字段:

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

对于输入,ENCLOSED BY 字符,如果存在,将从字段值的末尾剥离。(这适用于 OPTIONALLY 是否指定;OPTIONALLY 对输入解释没有影响。)ENCLOSED BY 字符前缀的出现将被解释为当前字段值的一部分。

如果字段以 ENCLOSED BY 字符开头,实例中的该字符仅在跟随字段或行 TERMINATED BY 序列时被识别为终止字段值。为了避免歧义,在字段值中的 ENCLOSED BY 字符的出现可以被双倍,并被解释为单个字符实例。例如,如果指定 ENCLOSED BY '"' ,引号将被处理如下所示:

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

FIELDS ESCAPED BY 控制如何读取或写入特殊字符:

  • 对于输入,如果 FIELDS ESCAPED BY 字符不为空,出现该字符将被剥离,紧随其后的字符将被视为字段值的一部分。一些两字符序列是例外,其中第一个字符是转义字符。这些序列在下表中显示(使用 \ 作为转义字符)。 NULL 处理规则将在本节后面描述。

    Character Escape Sequence
    \0 ASCII NUL (X'00') 字符
    \b 退格字符
    \n 换行(换行)字符
    \r 回车字符
    \t 制表符。
    \Z ASCII 26(控制+Z)
    \N NULL

    有关 \-escape 语法的更多信息,请参阅 第 11.1.1 节,“字符串字面量”

    如果 FIELDS ESCAPED BY 字符为空,则不进行转义序列解释。

  • 对于输出,如果 FIELDS ESCAPED BY 字符不为空,则用于前缀以下字符的输出:

    • FIELDS ESCAPED BY 字符。

    • FIELDS [OPTIONALLY] ENCLOSED BY 字符。

    • FIELDS TERMINATED BYLINES TERMINATED BY 值的第一个字符,如果 ENCLOSED BY 字符为空或未指定。

    • ASCII 0(实际写入的内容是 ASCII 0,而不是零值字节)。

    如果 FIELDS ESCAPED BY 字符为空,则不转义任何字符,并将 NULL 输出为 NULL,而不是 \N。指定空转义字符可能不是一个好主意,特别是如果您的数据中的字段值包含列表中的任何字符。

在某些情况下,字段和行处理选项会相互作用:

  • 如果 LINES TERMINATED BY 是空字符串,并且 FIELDS TERMINATED BY 不为空,则行也以 FIELDS TERMINATED BY 终止。

  • 如果 FIELDS TERMINATED BYFIELDS ENCLOSED BY 值都是空的(''),则使用固定行(非分隔)格式。在固定行格式中,不使用字段之间的分隔符(但您仍然可以有行终止符)。相反,列值将使用足够宽的字段宽度来读取和写入所有字段值。对于 TINYINT, SMALLINT, MEDIUMINT, INTBIGINT,字段宽度分别为 4、6、8、11 和 20,无论声明的显示宽度是什么。

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

    固定行格式也会影响 NULL 值的处理,如后面所述。

    Note

    固定大小格式不适用于多字节字符集。

NULL 值的处理根据 FIELDSLINES 选项的使用情况而有所不同:

  • 对于默认的 FIELDSLINES 值,NULL 将被写入为字段值 \N,用于输出,并且字段值 \N 将被读取为 NULL,用于输入(假设 ESCAPED BY 字符是 \)。

  • 如果 FIELDS ENCLOSED BY 不为空,包含文字 NULL 的字段将被读取为 NULL 值。这与包含在 FIELDS ENCLOSED BY 字符中的文字 NULL 不同,后者将被读取为字符串 'NULL'

  • 如果 FIELDS ESCAPED BY 为空,NULL 将被写入为文字 NULL

  • 使用固定行格式(当 FIELDS TERMINATED BYFIELDS ENCLOSED BY 都为空时),NULL 将被写入为空字符串。这使得 NULL 值和空字符串在表中不可区分,因为两者都被写入为空字符串。如果您需要在读取文件时区分这两者,请不要使用固定行格式。

尝试将 NULL 加载到 NOT NULL 列中将产生警告或错误,根据 Column Value Assignment 中的规则。

某些情况不支持 LOAD DATA

  • 固定大小行(FIELDS TERMINATED BYFIELDS ENCLOSED BY 都为空)和 BLOBTEXT 列。

  • 如果您指定了一个分隔符,它是另一个分隔符的前缀,LOAD DATA 无法正确地解释输入。例如,以下 FIELDS 子句将引发问题:

    FIELDS TERMINATED BY '"' ENCLOSED BY '"'
  • 如果 FIELDS ESCAPED BY 为空,字段值包含 FIELDS ENCLOSED BYLINES TERMINATED BY 后跟着 FIELDS TERMINATED BY 值,LOAD DATA 将停止读取字段或行太早。这是因为 LOAD DATA 无法正确地确定字段或行值的结束。

列列表规范

以下示例加载 persondata 表的所有列:

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

默认情况下,当没有在 LOAD DATA 语句末尾提供列列表时,输入行预计包含每个表列的字段。如果您只想加载表的一些列,请指定列列表:

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

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

输入预处理

每个实例 col_name_or_user_varLOAD DATA 语法中都是列名或用户变量。使用用户变量,SET 子句使您能够在将结果分配给列之前对其值进行预处理转换。

用户变量在 SET 子句中可以以多种方式使用。以下示例直接使用第一个输入列作为 t1.column1 的值,并将第二个输入列分配给用户变量,然后对其进行除法操作,然后将其用于 t1.column2 的值:

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

SET 子句也可以用于提供不来自输入文件的值。以下语句将 column3 设置为当前日期和时间:

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);

使用列/变量列表和 SET 子句受以下限制:

  • SET 子句中的赋值应该只有列名在赋值运算符的左侧。

  • 您可以在 SET 赋值的右侧使用子查询。返回值以分配给列的子查询只能是标量子查询。此外,您不能使用子查询来选择要加载的表。

  • IGNORE number LINES 子句忽略的行不会被处理以供列/变量列表或 SET 子句使用。

  • 由于用户变量没有显示宽度,因此不能在加载固定行格式数据时使用用户变量。

列值赋值

要处理输入行, LOAD DATA 将其拆分为字段,然后根据列/变量列表和 SET 子句(如果存在)使用这些值。然后,将结果行插入表中。如果表具有 BEFORE INSERTAFTER INSERT 触发器,则在插入行之前或之后激活触发器。

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

  • SQL 模式(sql_mode 系统变量的值)。模式可以是非限制性的,也可以在各种方式下限制性。例如,可以启用严格的 SQL 模式,或者模式可以包括值,如 NO_ZERO_DATENO_ZERO_IN_DATE

  • IGNORELOCAL 修饰符的存在或不存在。

这些因素结合起来,通过 LOAD DATA 产生限制性或非限制性的数据解释:

  • 如果 SQL 模式是限制性的,并且既没有 IGNORE 也没有 LOCAL 修饰符,那么数据解释是限制性的。错误将终止加载操作。

  • 如果 SQL 模式是非限制性的,或者指定了 IGNORELOCAL 修饰符,那么数据解释是非限制性的。(特别是,如果省略了 REPLACE 修饰符,那么任一修饰符都将覆盖限制性的 SQL 模式。)错误将变为警告,并且加载操作将继续。

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

  • 字段太多或太少将导致错误。

  • NULL(即 \N)分配给非 NULL 列将导致错误。

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

  • 无效值将产生错误。例如,对于数字列,值 'x' 将导致错误,而不是将其转换为 0。

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

  • 如果输入行具有太多字段,将忽略额外的字段,并增加警告数。

  • 如果输入行具有太少字段,将使用默认值分配缺少的列。默认值分配在 第 13.6 节,“数据类型默认值” 中描述。

  • NULL(即 \N)分配给非 NULL 列将分配隐式默认值为列数据类型。隐式默认值在 第 13.6 节,“数据类型默认值” 中描述。

  • 无效值将产生警告,而不是错误,并将其转换为列数据类型的“最近”有效值。例如:

    • 例如,对于数字列,值如 'x' 将被转换为 0。

    • 超出范围的数字或时间值将被截断到该列数据类型的最近端点。

    • 无效的 DATETIMEDATETIME 列值将被插入为隐式默认值,无论 SQL 模式 NO_ZERO_DATE 设置如何。隐式默认值是该类型的适当“零”值('0000-00-00 00:00:00''0000-00-00''00:00:00')。见 第 13.2 节,“日期和时间数据类型”

  • LOAD DATA 将空字段值与缺失字段区别对待:

    • 对于字符串类型,列将被设置为空字符串。

    • 对于数字类型,列将被设置为 0

    • 对于日期和时间类型,列将被设置为该类型的适当“零”值。见 第 13.2 节,“日期和时间数据类型”

    这些值与在 INSERTUPDATE 语句中明确分配空字符串给字符串、数字或日期/时间类型相同。

TIMESTAMP 列仅在该列为 NULL 值(即 \N)且该列未声明允许 NULL 值时,或者 TIMESTAMP 列的默认值为当前时间戳且在字段列表中省略时,才会被设置为当前日期和时间。

LOAD DATA 将所有输入视为字符串,因此您不能像在 INSERT 语句中那样使用数字值 для ENUMSET 列。所有 ENUMSET 值必须作为字符串指定。

BIT 值不能直接使用二进制表示法(例如 b'011010')。要解决这个问题,请使用 SET 子句来剥离leading b' 和 trailing ',并执行二进制到十进制的转换,以便 MySQL 正确地将值加载到 BIT 列中。

$> 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 值在 0b 二进制表示法中(例如 0b011010),请使用以下 SET 子句来剥离leading 0b

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

分区表支持

LOAD DATA 支持使用 PARTITION 子句明确选择分区,使用一个或多个逗号分隔的名称列表。使用该子句时,如果文件中的任何行不能插入到列表中的任何分区或子分区中,则语句将失败,错误为 Found a row not matching the given partition set。有关更多信息和示例,请参阅 第 26.5 节,“分区选择”

并发考虑

使用 LOW_PRIORITY 修饰符,执行 LOAD DATA 语句将被延迟,直到没有其他客户端从表中读取为止。这只影响使用表级锁定的存储引擎(例如 MyISAMMEMORYMERGE)。

使用 CONCURRENT 修饰符和满足并发插入条件的 MyISAM 表(即表中没有空闲块),其他线程可以在 LOAD DATA 执行时从表中检索数据。这将影响 LOAD DATA 的性能,即使没有其他线程在同一时间使用表。

语句结果信息

LOAD DATA 语句完成时,它将返回以下格式的信息字符串:

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

警告发生在与使用 INSERT 语句插入值时相同的条件下(见 第 15.2.7 节,“INSERT 语句”),除了 LOAD DATA 也生成警告,当输入行中的字段太少或太多时。

您可以使用 SHOW WARNINGS 获取警告列表,了解发生了什么错误。见 第 15.7.7.44 节,“SHOW WARNINGS 语句”

如果您使用 C API,可以通过调用 mysql_info() 函数获取语句信息。见 mysql_info()

复制考虑

LOAD DATA 被认为是不安全的语句复制。如果您使用 LOAD DATA 语句与 binlog_format=STATEMENT,每个副本将创建一个临时文件,包含数据。这个临时文件不加密,即使二进制日志加密在源上启用。如果需要加密,请使用基于行的或混合二进制日志格式,而不是基于语句的格式。更多信息,请参见 第 19.5.1.19 节,“复制和 LOAD DATA”

杂项主题

在 Unix 上,如果您需要 LOAD DATA 从管道读取,可以使用以下技术(示例将目录列表加载到表 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 进程读取数据。