当从服务器主机定位文件时,服务器使用下列规则:
- 如果给定一个完整的路径,服务器使用该路径名。
- 如果给定一个有一个或多个前置构件的相对路径,服务器以相对服务器的数据目录搜索文件。
- 如果给定一个没有前置构件的文件名,服务器从当前数据库的数据库目录搜寻文件。
注意,这些规则意味着,一个以 `./myfile.txt' 给出的文件是从服务器的数据目录中读取的,然而,以 `myfile.txt' 给出的一个文件是从当前数据库的数据目录下读取的。举例来说,下面的 load data 语句从 db1 数据库目录下读取文件 `data.txt',因为 db1 是当前数据库,即使该语句明确地指定读取的文件被放入到 db2 数据库中的一个表中:
mysql> use db1; mysql> load data infile "data.txt" into table db2.my_table;
replace 和 ignore 关键词控制对与现有的记录在唯一键值上重复的记录的处理。如果你指定 replace,新的记录行将替换有相同唯一键值的现有记录行。如果你指定 ignore,将跳过与现有的记录行在唯一键值上重复的输入记录行。如果你没有指定任何一个选项,当重复键值出现时,将会发生一个错误,文本文件的剩余部分也将被忽略。
如果你使用 local 关键词从一个本地文件中读取数据,在此操作过程中,服务器没有办法停止文件的传送,因此缺省的处理方式就好像是 ignore 被指定一样。
如果你在一个空的 myisam 表上使用 load data infile,所有非唯一索引会以一个分批方式被创建(就像 repair)。当有许多索引时,这通常可以使 load data infile 更快一些。
load data infile 的 select ... into outfile 的逆操作。查看章节 6.4.1 select 句法。
使用 select ... into outfile 将数据从一个数据库写到一个文件中。使用 load data infile 读取文件到数据库中。两个命令的 fields 和 lines 子句的句法是一样的。两个子句都是可选的,但是如果两个同时被指定,fields 子句必须出现在 lines 子句之前。
如果你指定一个 fields 子句,它的子句 (terminated by、[optionally] enclosed
by 和 escaped by) 也是可选的,不过,你必须至少指定它们中的一个。
如果你没有指定一个 fields 子句,缺省的相同于如果你这样写:
fields terminated by '\t' enclosed by '' escaped by '\\'
如果你没有指定一个 lines 子句,缺省的相同于如果你这样写:
lines terminated by '\n'
换句话说,当读取输入时,缺省值导致 load data infile 表现如下:
- 在换行符处寻找行的边界。
- 在定位符处将行分开放到字段中。
- 不认为字段由任何引号字符封装。
- 将有 “\” 开头的定位符、换行符或 `\' 解释为字段值的一个文字字符。
相反的,当写入输出时,缺省值导致 select ... into outfile 表现如下:
- 在字段值间加上定位符。
- 不用任何引号字符封装字段。
- 使用 “\” 转义出现在字段值中的定位符、换行符或 `\' 字符实例。
- 在行的结尾处加上换行符。
注意,为了写 fields escaped by '\\',你必须指定两个反斜线,该值会作为一个反斜线被读入。
ignore number lines 选项可被用于忽略文件开头处的一个列名的头:
mysql> load data infile "/tmp/file_name" into table test ignore 1 lines;
当你一前一后地使用 select ... into outfile 和 load data infile 将数据从一个数据库写到一个文件中,然后再从文件中将它读入数据库中时,两个命令的字段和行处理选项必须匹配。否则,load data infile 将不能正确地解释文件内容。假设你使用 select ... into outfile 以逗号分隔字段的方式将数据写入到一个文件中:
mysql> select * into outfile 'data.txt'
-> fields terminated by ','
-> from ...;
为了将由逗号分隔的文件读回时,正确的语句应该是:
mysql> load data infile 'data.txt' into table table2
-> fields terminated by ',';
如果你试图用下面所示的语句读取文件,它将不会工作,因为命令 load data infile 以定位符区分字段值:
mysql> load data infile 'data.txt' into table table2
-> fields terminated by '\t';
可能的结果是每个输入行将被解释为一个单独的字段。
load data infile 也可以被用来读取从外部来源获得的文件。例如,dbase 格式的文件,字段以逗号分隔并以双引号包围着。如果文件中的行以一个换行符终止,那么下面所示的可以说明你将用来装载文件的字段和行处理选项:
mysql> load data infile 'data.txt' into table tbl_name
-> fields terminated by ',' enclosed by '"'
-> lines terminated by '\n';
任何字段和行处理选项都可以指定一个空字符串('')。如果不是空的,fields [optionally] enclosed by 和 fields escaped by 值必须是一个单个字符。fields terminated by 和 lines terminated by 值可以超过一个字符。例如,为了写入由回车换行符终止的行,或读取包含这样的行的文件,应该指定一个 lines terminated by '\r\n' 子句。
举例来说,为了读取一个文件到一个 sql 表中,文件以一行 %% 分隔(开玩笑的),你可以这样做:
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 字符仅被作用于包围 char 和 varchar 字段: