LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name [FIELDS [TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char' ] ] [LINES [STARTING BY 'string']
[TERMINATED BY 'string'] ] [IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = expr,...)]
LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为一个文字字符串。mysql
由character_set_database系统变量指示的字符集被用于解释文件中的信息。SET NAMES和character_set_client的设置不会影响对输入的解释。sql
典型的示例shell
LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE tbl_name FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
若是您只想载入一个表的部分列,则应指定一个列清单:数据库
LOAD DATA LOCAL INFILE 'persondata.txt' INTO TABLE persondata (col1,col2);
若是指定了LOCAL,则被认为与链接的客户端有关:bash
当在服务器主机上为文件定位时,服务器使用如下规则:服务器
注意,这些规则意味着名为./myfile.txt的文件会从服务器数据目录中被读取,而名为myfile.txt的一样的文件会从默认数据库的数据库目录中读取。ui
从客户端使用绝对路径load数据spa
LOAD DATA LOCAL INFILE '/import/data.txt' INTO TABLE db2.my_table;
从服务器里使用相对路径load数据.net
下面的LOAD DATA语句会从db1数据库目录中读取文件data.txt,由于db1是当前数据库。即便语句明确把文件载入到db2数据库中的表里,也会从db1目录中读取。命令行
USE db1; LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
IGNORE number LINES选项能够被用于在文件的开始处忽略行。
您可使用IGNORE 1 LINES来跳过一个包含列名称的起始标题行:
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
有些输入记录把原有的记录复制到惟一关键字值上。REPLACE和IGNORE关键字用于控制这些输入记录的操做。
若是您指定了REPLACE,则输入行会替换原有行(换句话说,与原有行同样,对一个主索引或惟一索引具备相同值的行)。
若是您指定IGNORE,则把原有行复制到惟一关键字值的输入行被跳过。
若是您这两个选项都不指定,则运行状况根据LOCAL关键词是否被指定而定。不使用LOCAL时,当出现重复关键字值时,会发生错误,而且剩下的文本文件被忽略。使用LOCAL时,默认的运行状况和IGNORE被指定时的状况相同;这是由于在运行中间,服务器没有办法停止文件的传输。
若是您对一个空的MyISAM表使用LOAD DATA INFILE,则全部的非惟一索引会被建立在一个独立批中(对于REPAIR TABLE)。当您有许多索引时,这一般会使LOAD DATA INFILE大大加快。一般,LOAD DATA INFILE的速度会很是快,可是在某些极端状况下,您能够在把文件载入到表中以前使用ALTER TABLE...DISABLE KEYS关闭LOAD DATA INFILE,或者在载入文件以后使用ALTER TABLE...ENABLE KEYS再次建立索引,使建立索引的速度更快。
若是您不指定FIELDS子句,则默认值为假设您写下以下语句时的值:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
若是您不指定LINES子句,则默认值为假设您写下以下语句时的值:
LINES TERMINATED BY '\n' STARTING BY ''
换句话说,当读取输入值时,默认值会使LOAD DATA INFILE按以下方式运行:
在新行处寻找行的边界。
不会跳过任何行前缀。
在制表符处把行分解为字段。
不但愿字段被包含在任何引号字符之中。
出现制表符、新行、或在‘\’前有‘\’时,理解为做为字段值一部分的文字字符。
相反的,当编写输出值时,默认值会使SELECT...INTO OUTFILE按以下方式运行:
在字段之间写入制表符。
不把字段包含在任何引号字符中。
当字段值中出现制表符、新行或‘\’时,使用‘\’进行转义。
在行的末端写入新行。
注意,要写入FIELDS ESCAPED BY ‘\\’,您必须为待读取的值指定两个反斜杠,做为一个单反斜杠使用。
备注:若是您已经在Windows系统中生成了文本文件,您可能必须使用LINES TERMINATED BY ‘\r\n’来正确地读取文件,由于Windows程序一般使用两个字符做为一个行终止符。部分程序,当编写文件时,可能会使用\r做为行终止符。要读取这样的文件,应使用LINES TERMINATED BY ‘\r’。
若是全部您但愿读入的行都含有一个您但愿忽略的共用前缀,则您可使用'prefix_string'来跳过前缀(和前缀前的字符)。若是某行不包括前缀,则整个行被跳过。注释:prefix_string会出如今一行的中间。
如下面的test.txt为文件源
xxx"row",1 something xxx"row",2
使用如下sql导入数据
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test LINES STARTING BY "xxx";
最后并只获得数据("row",1)和("row",2)。
若是jokes被由%%组成的行分隔,要读取包含jokes的文件,您能够这么操做:
LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes FIELDS TERMINATED BY '' LINES TERMINATED BY '\n%%\n' (joke);
TERMINATED用于控制字段的分隔符,能够为多个字符。
ENCLOSED BY用于用于控制字段的引号,必须为单一字符,若是您忽略了词语OPTIONALLY,则全部的字段都被包含在ENCLOSED BY字符串中,若是您指定了OPTINALLY,则ENCLOSED BY字符只被用于包含具备字符串数据类型(好比CHAR, BINARY, TEXT或ENUM)的列中的值.
SELECT...INTO OUTFILE导出数据,ENCLOSED BY '"',忽略OPTIONALLY
"1","a string","100.20"
SELECT...INTO OUTFILE导出数据,ENCLOSED BY '"',指定OPTIONALLY
1,"a string",100.20
ESCAPED BY用于转义,FIELDS ESCAPED BY值必须为单一字符。
若是FIELDS ESCAPED BY字符为空字符,则没有字符被转义,而且NULL被做为NULL输出,而不是\N。去指定一个空的转义符不是一个好办法,特别是若是数据的字段值包含任何刚给定的清单中的字符时,更不能这么作。
若是在字段值内出现ENCLOSED BY字符,则经过使用ESCAPED BY字符做为前缀,对ENCLOSED BY字符进行转义。
一、 能够用--local-infile=0选项启动mysqld从服务器端禁用全部LOAD DATA LOCAL命令。
便是在/etc/my.cnf的[mysqld]下面添加local-infile=0选项。
二、 对于mysql命令行的客户端,能够通指定--local-infile[=1]选项启用LOAD DATA LOCAL命令,
或经过--local-infile=0选项禁用。
相似地,对于mysqlimport,--local or -L选项启用本地数据库文件装载。在任何状况下,成功进行本地装载须要服务器启有相关选项。
当PHP设置权限后仍然不可以导入数据时:
因mysql 版本太低或者其余缘由,mysql配置文件中设置了local_infile=1。经过查数据库 show variables like 'local_inile';mysql语句设置权限:set global local_infile = 1; 都没有效。
使用shell 操做mysql 导入
#!/bin/bash file=$1 table=$2 query="LOAD DATA LOCAL INFILE '$file' INTO TABLE $table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (uid,name,score,home,ctime);"
echo 'file:: '$file'<br>'
echo 'tbl:: '$table'<br>'
/usr/local/services/mysql/bin/mysql --local-infile -h127.0.0.1 -P3600 -uroot -p123456 -e "$query"