13.2.6 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语句以非常高的速度将文本文件中的行读取到 table 中。 LOAD DATA选择...进入外档的补码。 (请参阅第 13.2.9.1 节“ SELECT ... INTO 语句”。)要将数据从 table 写入文件,请使用选择...进入外档。要将文件读回到 table 中,请使用LOAD DATA。两条语句的FIELDSLINES子句的语法相同。

您也可以使用mysqlimportUtil 加载数据文件。参见第 4.5.5 节“ mysqlimport-一个数据导入程序”mysqlimport通过向服务器发送LOAD DATA语句来进行操作。

有关INSERTLOAD DATA的效率以及LOAD DATA的效率的更多信息,请参见第 8.2.4.1 节“优化 INSERT 语句”

分区 table 支持

LOAD DATA使用PARTITION选项支持显式分区选择,该选项带有一个或多个以逗号分隔的分区,子分区或两者的名称列 table。使用此选项时,如果无法将文件中的任何行插入列 table 中命名的任何分区或子分区中,则该语句将失败,并显示错误“找到与给定分区集不匹配的行”。有关更多信息和示例,请参见第 22.5 节“分区选择”

对于使用 table 锁(例如MyISAMLOAD DATA)的存储引擎的分区 table,无法修剪任何分区锁。这不适用于使用具有行级锁定的存储引擎(例如InnoDB)的 table。有关更多信息,请参见第 22.6.4 节“分区和锁定”

Importing 文件名,位置和内容解释

文件名必须以 Literals 字符串形式给出。在 Windows 上,在路径名中将反斜杠指定为正斜杠或加倍的反斜杠。 character_set_filesystem系统变量控制文件名字符集的解释。

服务器使用character_set_database系统变量指示的字符集来解释文件中的信息。 SET NAMEScharacter_set_client的设置不影响 Importing 的解释。如果 Importing 文件的内容使用的字符集与默认字符集不同,通常最好使用CHARACTER SET子句指定文件的字符集。 binary字符集指定“不进行转换”。

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

Note

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

LOCAL修饰符会影响文件的预期位置和错误处理,如稍后所述。 LOCAL仅在您的服务器和 Client 端都已配置为允许时才有效。例如,如果在禁用local_infile系统变量的情况下启动mysqld,则LOCAL不起作用。参见第 6.1.6 节“ LOAD DATA LOCAL 的安全注意事项”

LOCAL修饰符会影响文件的预期位置:

  • 如果指定了LOCAL,则 Client 端主机上的 Client 端程序将读取该文件并将其发送到服务器。可以将文件指定为完整路径名以指定其确切位置。如果给出为相对路径名,则相对于启动 Client 端程序的目录解释该名称。

当将LOCALLOAD DATA一起使用时,将在 MySQL 服务器存储临时文件的目录中创建文件的副本。参见第 B.4.3.5 节“ MySQL 在哪里存储临时文件”。该目录中副本的足够空间不足会导致本地加载数据语句失败。

  • 如果未指定LOCAL,则该文件必须位于服务器主机上,并且可以由服务器直接读取。服务器使用以下规则来定位文件:

  • 如果文件名是绝对路径名,则服务器将使用给定的名称。

    • 如果文件名是具有一个或多个前导组件的相对路径名,则服务器将搜索相对于服务器数据目录的文件。

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

在非LOCAL情况下,这些规则意味着从服务器的数据目录中读取名为./myfile.txt的文件,而从默认数据库的数据库目录中读取名为myfile.txt的文件。例如,如果db1是默认数据库,则以下LOAD DATA语句从db1的数据库目录中读取文件data.txt,即使该语句将文件显式加载到db2数据库的 table 中:

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

LOCAL加载操作读取服务器上的文本文件。出于安全原因,此类操作要求您具有FILE特权。参见第 6.2.2 节“ MySQL 提供的特权”。同样,非LOCAL加载操作受secure_file_priv系统变量设置的限制。如果变量值为非空目录名,则要加载的文件必须位于该目录中。如果变量值为空(不安全),则服务器仅需要读取文件。

使用LOCAL比让服务器直接访问文件要慢一些,因为文件内容必须由 Client 端通过连接发送到服务器。另一方面,您不需要FILE特权即可加载本地文件。

LOCAL还影响错误处理:

  • 对于LOAD DATA,数据解释和重复键错误终止操作。

  • 使用本地加载数据时,数据解释和重复键错误将成为警告,并且操作将 continue,因为服务器无法在操作过程中停止文件的传输。对于重复键错误,这与指定IGNORE相同。 IGNORE在本节的后面部分将进一步说明。

Concurrency Considerations

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

如果使用满足并发插入条件的MyISAMtable 指定CONCURRENT修饰符(即,中间不包含空闲块),则其他线程可以在执行LOAD DATA时从 table 中检索数据。即使没有其他线程同时使用该 table,此修饰符也会稍微影响LOAD DATA的性能。

有关与复制有关的LOAD DATA的信息,请参见第 16.4.1.18 节,“复制和加载数据”

Duplicate-Key Handling

REPLACEIGNORE修饰符控制 Importing 行的处理,这些 Importing 行复制唯一键值上的现有行:

  • 如果您未指定任何一个修饰符,则行为取决于是否指定了LOCAL修饰符。如果没有LOCAL,则在找到重复的键值时会发生错误,而文本文件的其余部分将被忽略。对于LOCAL,默认行为与指定IGNORE相同。这是因为服务器无法在操作过程中停止文件的传输。

Index Handling

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

如果在空的MyISAMtable 上使用LOAD DATA,则会在单独的批处理中创建所有非唯一索引(与REPAIR TABLE一样)。通常,当您有很多索引时,这会使LOAD DATA更快。在某些极端情况下,您可以更快地创建索引,方法是在将文件加载到 table 之前使用ALTER TABLE ...禁用键将其关闭,并在加载文件后使用ALTER TABLE ...启用键重新创建索引。参见第 8.2.4.1 节“优化 INSERT 语句”

场线处理

对于LOAD DATA选择...进入外档语句,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 ''

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

换句话说,默认值会导致LOAD DATA在读取 Importing 时的行为如下:

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

  • 不要跳过任何行前缀。

  • 在选项卡上将行分成字段。

  • 不要期望将字段括在任何引号字符内。

  • 将转义字符\后面的字符解释为转义序列。例如,\t\n\\分别 table 示制 table 符,换行符和反斜杠。有关转义序列的完整列 table,请参见稍后对FIELDS ESCAPED BY的讨论。

相反,默认值会导致选择...进入外档在写入输出时的行为如下:

  • 在字段之间编写标签。

  • 不要将字段括在任何引号中。

  • 使用\可以转义出现在字段值中的 tab,换行符或\的实例。

  • 在行尾写换行符。

Note

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

如果所有 Importing 行都有您要忽略的公共前缀,则可以使用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;

当您将选择...进入外档LOAD DATA结合使用将数据从数据库写入文件,然后稍后将文件读回数据库时,两个语句的字段处理选项和行处理选项必须匹配。否则,LOAD DATA将无法正确解释文件的内容。假设您使用选择...进入外档来写一个文件,其字段由逗号分隔:

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

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

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

相反,如果您尝试使用如下所示的语句读取文件,则该文件将无效,因为它会指示LOAD DATA在字段之间查找制 table 符:

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

可能的结果是,每条 Importing 线将被解释为单个字段。

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;

如果 Importing 值不一定用引号引起来,请在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控制字段的引用。对于输出(选择...进入外档),如果省略单词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

通过在字段值中使用ESCAPED BY字符作为前缀,可以避免出现ENCLOSED BY字符。同样,如果您指定一个空的ESCAPED BY值,则可能会无意中生成LOAD DATA无法正确读取的输出。例如,如果转义字符为空,则刚刚显示的前面的输出将显示如下。请注意,第四行的第二个字段在引号后包含一个逗号(错误地)似乎终止了该字段:

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

对于 Importing,ENCLOSED BY字符(如果存在)从字段值的末尾去除。 (无论是否指定OPTIONALLY都是如此; OPTIONALLY对 Importing 解释没有影响.)出现ENCLOSED BY字符后跟ESCAPED 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控制如何读取或写入特殊字符:

  • 对于 Importing,如果FIELDS ESCAPED BY字符不为空,则会删除该字符的出现,并且直接将下一个字符视为字段值的一部分。一些两个字符的序列是 exception,其中第一个字符是转义字符。下 table 中显示了这些序列(使用\table 示转义字符)。 NULL处理的规则将在本节后面介绍。
CharacterEscape Sequence
\0 ASCII NUL(X'00')字符
\b 退格字符
\n 换行符(换行符)
\r 回车符
\t 制 table 符。
\Z ASCII 26(控制 Z)
\N NULL

有关\ -escape 语法的更多信息,请参见第 9.1.1 节“字符串 Literals”

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

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

  • FIELDS ESCAPED BY个字符。

    • FIELDS [OPTIONALLY] ENCLOSED BY个字符。

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

    • ASCII 0(在转义字符后面实际写的是 ASCII 0,而不是零值字节)。

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

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

  • 如果LINES TERMINATED BY为空字符串,而FIELDS TERMINATED BY为非空字符串,则行也以FIELDS TERMINATED BY终止。

  • 如果FIELDS TERMINATED BYFIELDS ENCLOSED BY值都为空(''),则使用固定行(无界)格式。使用固定行格式时,字段之间不使用定界符(但是您仍然可以使用行终止符)。而是使用足够宽的字段宽度来读取和写入列值,以容纳该字段中的所有值。对于TINYINTSMALLINTMEDIUMINTINTBIGINT,无论声明的显示宽度是多少,字段宽度分别为 4、6、8、11 和 20.

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

固定行格式还会影响对NULL值的处理,如稍后所述。

Note

如果使用多字节字符集,则固定尺寸格式不起作用。

NULL值的处理方式取决于所使用的FIELDSLINES选项:

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

  • 如果FIELDS ENCLOSED BY不为空,则将包含 Literals 字词NULL作为其值的字段读取为NULL值。这与FIELDS ENCLOSED BY字符内的NULL单词不同,后者被读取为字符串'NULL'

  • 如果FIELDS ESCAPED BY为空,则NULL被写为NULL

  • 使用固定行格式(当FIELDS TERMINATED BYFIELDS ENCLOSED BY均为空时使用),NULL被写为空字符串。这将导致NULL值和 table 中的空字符串在写入文件时无法区分,因为它们都是作为空字符串写入的。如果在读回文件时需要能够区分两者,则不应使用固定行格式。

尝试将NULL加载到NOT NULL列中会导致为列的数据类型分配隐式默认值和警告,或者在严格 SQL 模式下出错。隐式默认值在第 11.6 节“数据类型默认值”中讨论。

LOAD DATA不支持某些情况:

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

  • 如果您指定一个与另一个分隔符相同或作为另一个分隔符的前缀,则LOAD DATA无法正确解释 Importing。例如,以下FIELDS子句将引起问题:

FIELDS TERMINATED BY '"' ENCLOSED BY '"'
  • 如果FIELDS ESCAPED BY为空,则包含出现的FIELDS ENCLOSED BYLINES TERMINATED BY的字段值后跟FIELDS TERMINATED BY的值将导致LOAD DATA太早停止读取字段或行。发生这种情况是因为LOAD DATA无法正确确定字段或行值的结束位置。

列列 table 规范

下面的示例加载persondatatable 的所有列:

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

默认情况下,如果在LOAD DATA语句的末尾未提供任何列列 table,则 Importing 行应包含每个 table 列的字段。如果只想加载 table 的某些列,请指定列列 table:

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

如果 Importing 文件中字段的 Sequences 与 table 中列的 Sequences 不同,则还必须指定列列 table。否则,MySQL 无法告知如何将 Importing 字段与 table 列匹配。

Input Preprocessing

每个* col_name_or_user_var *值都是列名或用户变量。使用用户变量,可以使用SET子句对它们的值执行预处理转换,然后再将结果分配给列。

SET子句中的用户变量可以多种方式使用。以下示例直接将第一 Importing 列用于t1.column1的值,并将第二 Importing 列分配给用户变量,该用户变量在用于t1.column2值之前要进行除法运算:

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

SET子句可用于提供不是从 Importing 文件派生的值。以下语句将column3设置为当前日期和时间:

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

您还可以通过将 Importing 值分配给用户变量而不将变量分配给 table 列来丢弃它:

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

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

  • SET子句中的分配在分配运算符的左侧应仅具有列名称。

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

  • 对于列/变量列 table 或SET子句,不会处理被IGNORE子句忽略的行。

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

处理 Importing 行时,LOAD DATA将其分成多个字段,并根据列/变量列 table 和SET子句(如果存在)使用值。然后将结果行插入到 table 中。如果 table 有BEFORE INSERTAFTER INSERT触发器,则分别在插入行之前或之后激活它们。

如果 Importing 行的字段太多,则多余的字段将被忽略,并且警告数量会增加。

如果 Importing 行的字段太少,则缺少 Importing 字段的 table 列将设置为其默认值。默认值分配在第 11.6 节“数据类型默认值”中描述。

空字段值解释为与缺少字段不同:

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

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

  • 对于日期和时间类型,该列设置为该类型的相应“零”值。参见第 11.2 节“日期和时间数据类型”

如果您在INSERTUPDATE语句中为字符串,数字或日期或时间类型显式分配一个空字符串,这些结果将与这些值相同。

如果将 SQL 模式设置为限制性值,则对空或不正确的字段值的处理与刚刚描述的不同。例如,如果将sql_mode设置为TRADITIONAL,则对数字列转换为空值或'x'之类的值将导致错误,而不是转换为 0.(对于LOCALIGNORE,警告发生而不是错误,即使是限制性sql_mode值,并且使用与非限制性 SQL 模式相同的最接近值行为插入行。这是因为服务器无法在操作中间停止文件的传输。)

仅当该列有NULL值(即\N)并且该列未声明为允许NULL值,或者TIMESTAMP列的默认值为当前时间戳并将其设置为TIMESTAMP列时,才会设置为当前日期和时间指定字段列 table 时,将从字段列 table 中省略。

LOAD DATA将所有 Importing 视为字符串,因此无法像INSERT语句那样对ENUMSET列使用数字值。必须将所有ENUMSET值指定为字符串。

不能使用二进制 table 示法直接加载BIT值(例如b'011010')。要解决此问题,请使用SET子句剥离开头的b'和结尾的'并执行从 2 到 10 的基数转换,以便 MySQL 正确地将值加载到BIT列中:

shell> cat /tmp/bit_test.txt
b'10'
b'1111111'
shell> 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)

对于0b二进制符号中的BIT值(例如0b011010),请使用此SET子句除去开头的0b

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

语句结果信息

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

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

在与使用INSERT语句插入值(请参见第 13.2.5 节“ INSERT 语句”)插入值的情况相同的情况下,会发生警告,但在 Importing 行中的字段太少或太多时,LOAD DATA也会生成警告。

您可以使用SHOW WARNINGS获取前max_error_count条警告的列 table,以获取有关发生问题的信息。参见第 13.7.5.40 节“ SHOW 警告声明”

如果使用的是 C API,则可以通过调用mysql_info()函数获取有关该语句的信息。参见第 27.7.6.36 节“ mysql_info()”

Miscellaneous Topics

在 Unix 上,如果需要LOAD DATA来从管道读取,则可以使用以下技术(该示例将/目录的列 table 加载到 tabledb1.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进程读取数据为止。