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。两条语句的FIELDS
和LINES
子句的语法相同。
您也可以使用mysqlimportUtil 加载数据文件。参见第 4.5.5 节“ mysqlimport-一个数据导入程序”。 mysqlimport通过向服务器发送LOAD DATA语句来进行操作。
有关INSERT与LOAD DATA的效率以及LOAD DATA的效率的更多信息,请参见第 8.2.4.1 节“优化 INSERT 语句”。
分区 table 支持
LOAD DATA使用PARTITION
选项支持显式分区选择,该选项带有一个或多个以逗号分隔的分区,子分区或两者的名称列 table。使用此选项时,如果无法将文件中的任何行插入列 table 中命名的任何分区或子分区中,则该语句将失败,并显示错误“找到与给定分区集不匹配的行”。有关更多信息和示例,请参见第 22.5 节“分区选择”。
对于使用 table 锁(例如MyISAM,LOAD DATA)的存储引擎的分区 table,无法修剪任何分区锁。这不适用于使用具有行级锁定的存储引擎(例如InnoDB)的 table。有关更多信息,请参见第 22.6.4 节“分区和锁定”。
Importing 文件名,位置和内容解释
文件名必须以 Literals 字符串形式给出。在 Windows 上,在路径名中将反斜杠指定为正斜杠或加倍的反斜杠。 character_set_filesystem系统变量控制文件名字符集的解释。
服务器使用character_set_database系统变量指示的字符集来解释文件中的信息。 SET NAMES和character_set_client的设置不影响 Importing 的解释。如果 Importing 文件的内容使用的字符集与默认字符集不同,通常最好使用CHARACTER SET
子句指定文件的字符集。 binary
字符集指定“不进行转换”。
LOAD DATA会将文件中的所有字段解释为具有相同的字符集,而不管字段值加载到的列的数据类型如何。为了正确解释文件内容,必须确保使用正确的字符集编写文件。例如,如果您使用mysqldump -T或通过在mysql中发出选择...进入外档语句来写入数据文件,请确保使用--default-character-set
选项,以便将输出写入字符集中,以便在文件加载LOAD DATA时使用。
Note
无法加载使用ucs2
,utf16
,utf16le
或utf32
字符集的数据文件。
LOCAL
修饰符会影响文件的预期位置和错误处理,如稍后所述。 LOCAL
仅在您的服务器和 Client 端都已配置为允许时才有效。例如,如果在禁用local_infile系统变量的情况下启动mysqld,则LOCAL
不起作用。参见第 6.1.6 节“ LOAD DATA LOCAL 的安全注意事项”。
LOCAL
修饰符会影响文件的预期位置:
- 如果指定了
LOCAL
,则 Client 端主机上的 Client 端程序将读取该文件并将其发送到服务器。可以将文件指定为完整路径名以指定其确切位置。如果给出为相对路径名,则相对于启动 Client 端程序的目录解释该名称。
当将LOCAL
与LOAD 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 级锁定(例如MyISAM
,MEMORY
和MERGE
)的存储引擎。
如果使用满足并发插入条件的MyISAM
table 指定CONCURRENT
修饰符(即,中间不包含空闲块),则其他线程可以在执行LOAD DATA时从 table 中检索数据。即使没有其他线程同时使用该 table,此修饰符也会稍微影响LOAD DATA的性能。
有关与复制有关的LOAD DATA的信息,请参见第 16.4.1.18 节,“复制和加载数据”。
Duplicate-Key Handling
REPLACE
和IGNORE
修饰符控制 Importing 行的处理,这些 Importing 行复制唯一键值上的现有行:
-
如果指定
REPLACE
,则 Importing 行将替换现有行。换句话说,主键或唯一索引的值与现有行的值相同的行。参见第 13.2.8 节“ REPLACE 语句”。 -
如果指定
IGNORE
,则将在唯一键值上复制现有行的行丢弃。有关更多信息,请参见IGNORE 关键字和严格 SQL 模式的比较。
- 如果您未指定任何一个修饰符,则行为取决于是否指定了
LOCAL
修饰符。如果没有LOCAL
,则在找到重复的键值时会发生错误,而文本文件的其余部分将被忽略。对于LOCAL
,默认行为与指定IGNORE
相同。这是因为服务器无法在操作过程中停止文件的传输。
Index Handling
要在加载操作期间忽略外键约束,请在执行LOAD DATA之前执行SET foreign_key_checks = 0
语句。
如果在空的MyISAM
table 上使用LOAD DATA,则会在单独的批处理中创建所有非唯一索引(与REPAIR TABLE一样)。通常,当您有很多索引时,这会使LOAD DATA更快。在某些极端情况下,您可以更快地创建索引,方法是在将文件加载到 table 之前使用ALTER TABLE ...禁用键将其关闭,并在加载文件后使用ALTER TABLE ...启用键重新创建索引。参见第 8.2.4.1 节“优化 INSERT 语句”。
场线处理
对于LOAD DATA和选择...进入外档语句,FIELDS
和LINES
子句的语法相同。这两个子句都是可选的,但如果同时指定了FIELDS
,则必须在LINES
之前。
如果指定FIELDS
子句,则其每个子句(TERMINATED BY
,[OPTIONALLY] ENCLOSED BY
和ESCAPED BY
)也是可选的,但必须至少指定其中一个。这些子句的参数只能包含 ASCII 字符。
如果您未指定FIELDS
或LINES
子句,则默认值与编写此代码的默认值相同:
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 BY
和FIELDS ESCAPED BY
值必须为单个字符。 FIELDS TERMINATED BY
,LINES STARTING BY
和LINES 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
字符仅用于封闭具有字符串数据类型(例如CHAR,BINARY,TEXT或ENUM)的列中的值:
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
处理的规则将在本节后面介绍。
Character | Escape 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 BY
和LINES TERMINATED BY
值的第一个字符。 -
ASCII
0
(在转义字符后面实际写的是 ASCII0
,而不是零值字节)。
-
如果FIELDS ESCAPED BY
字符为空,则不转义任何字符,并且将NULL
输出为NULL
而不是\N
。指定一个空的转义字符可能不是一个好主意,特别是如果数据中的字段值包含刚给出的列 table 中的任何字符时,尤其如此。
在某些情况下,字段和行处理选项会相互作用:
-
如果
LINES TERMINATED BY
为空字符串,而FIELDS TERMINATED BY
为非空字符串,则行也以FIELDS TERMINATED BY
终止。 -
如果
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
值都为空(''
),则使用固定行(无界)格式。使用固定行格式时,字段之间不使用定界符(但是您仍然可以使用行终止符)。而是使用足够宽的字段宽度来读取和写入列值,以容纳该字段中的所有值。对于TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT,无论声明的显示宽度是多少,字段宽度分别为 4、6、8、11 和 20.
LINES TERMINATED BY
仍用于分隔行。如果一行不包含所有字段,则其余各列将设置为其默认值。如果没有行终止符,则应将其设置为''
。在这种情况下,文本文件必须包含每一行的所有字段。
固定行格式还会影响对NULL
值的处理,如稍后所述。
Note
如果使用多字节字符集,则固定尺寸格式不起作用。
NULL
值的处理方式取决于所使用的FIELDS
和LINES
选项:
-
对于默认的
FIELDS
和LINES
值,将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 BY
和FIELDS ENCLOSED BY
均为空时使用),NULL
被写为空字符串。这将导致NULL
值和 table 中的空字符串在写入文件时无法区分,因为它们都是作为空字符串写入的。如果在读回文件时需要能够区分两者,则不应使用固定行格式。
尝试将NULL
加载到NOT NULL
列中会导致为列的数据类型分配隐式默认值和警告,或者在严格 SQL 模式下出错。隐式默认值在第 11.6 节“数据类型默认值”中讨论。
LOAD DATA不支持某些情况:
-
固定大小的行(
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
均为空)和BLOB或TEXT列。 -
如果您指定一个与另一个分隔符相同或作为另一个分隔符的前缀,则LOAD DATA无法正确解释 Importing。例如,以下
FIELDS
子句将引起问题:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
- 如果
FIELDS ESCAPED BY
为空,则包含出现的FIELDS ENCLOSED BY
或LINES TERMINATED BY
的字段值后跟FIELDS TERMINATED BY
的值将导致LOAD DATA太早停止读取字段或行。发生这种情况是因为LOAD DATA无法正确确定字段或行值的结束位置。
列列 table 规范
下面的示例加载persondata
table 的所有列:
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 INSERT
或AFTER INSERT
触发器,则分别在插入行之前或之后激活它们。
如果 Importing 行的字段太多,则多余的字段将被忽略,并且警告数量会增加。
如果 Importing 行的字段太少,则缺少 Importing 字段的 table 列将设置为其默认值。默认值分配在第 11.6 节“数据类型默认值”中描述。
空字段值解释为与缺少字段不同:
-
对于字符串类型,该列设置为空字符串。
-
对于数字类型,该列设置为
0
。 -
对于日期和时间类型,该列设置为该类型的相应“零”值。参见第 11.2 节“日期和时间数据类型”。
如果您在INSERT或UPDATE语句中为字符串,数字或日期或时间类型显式分配一个空字符串,这些结果将与这些值相同。
如果将 SQL 模式设置为限制性值,则对空或不正确的字段值的处理与刚刚描述的不同。例如,如果将sql_mode设置为TRADITIONAL,则对数字列转换为空值或'x'
之类的值将导致错误,而不是转换为 0.(对于LOCAL
或IGNORE
,警告发生而不是错误,即使是限制性sql_mode值,并且使用与非限制性 SQL 模式相同的最接近值行为插入行。这是因为服务器无法在操作中间停止文件的传输。)
仅当该列有NULL
值(即\N
)并且该列未声明为允许NULL
值,或者TIMESTAMP列的默认值为当前时间戳并将其设置为TIMESTAMP列时,才会设置为当前日期和时间指定字段列 table 时,将从字段列 table 中省略。
LOAD DATA将所有 Importing 视为字符串,因此无法像INSERT语句那样对ENUM或SET列使用数字值。必须将所有ENUM和SET值指定为字符串。
不能使用二进制 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进程读取数据为止。