您好,欢迎访问一九零五行业门户网

mysql 的load data infile

前些日子在开发一个舆情监测系统,需要在一个操作过程中往数据表里插入大量的数据,为了改变以往生硬地逐条数据插入的笨办法,也为了提高执行效率,决定用load data infile来执行数据插入。
load data infile语句从一个文本文件中以很高的速度读入一个表中。如果指定local关键词,从客户主机读文件。如果local没指定,文件必须位于服务器上。(local在mysql3.22.6或以后版本中可用。)
为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用load data infile,在服务器主机上你必须有file的权限。
头一回用load data infile,以为只是把插入语句写到一个文件里,然后用load data infile把文件传入数据库就ok了,于是生成了一个内容类似同n句 insert into table_name (`id`,`name`,`content`) values (1,a,abc),(2,b,abc),(3,c,abc);组成的.sql文件。然后在php中执行 load data infile 'file_name.sql' into table table_name;发现总是执行出错,真晕,不知道怎么回事,只好去再详细地读一下mysql的应用手册:
如果你指定一个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表现如下:
在换行符处寻找行边界
在定位符处将行分进字段
不要期望字段由任何引号字符封装
将由“\”开头的定位符、换行符或“\”解释是字段值的部分字面字符
才知道原来我的sql里的内容并不是按照 load data infile的缺省设置来写的, 例如缺省设置下,每一句插入语句里的字段是由制表符隔开且内容不以任何引号封装(也就是括起来)的,但我的是由逗号隔开且有双引号括起来的,难怪会执行出错。
于是,将sql执行语句写成mysql_query('load data local infile file_name.sql into table `table_name` fields terminated by , enclosed by \'\' escaped by \\\ lines terminated by \n starting by ');
这会算是执行成功了,成功地往指定的数据表里插入了很多条记录,可是又发现了一个问题,插入的数据乱七八糟的,字段与要插入的内容不符合我的要求,而且有好多是把字段名给插入到字段里面去了,唉,只好再回头去又读了一遍mysql中的load data infile用法,终于搞明白了,原来file_name.sql里面只需要按一定格式把内容写进去就行了,不是把整个sql执行语句都写进去的,真笨!^_^
于是,把内容换成了
1,a,abc
2,b,abc
3,c,abc
而且内容要与数据表里的字段从数量上和顺序上都要严格对应
在本地服务器(我用的是window主机)上测试了一下,ok,操作成功!
然后把程序传到网络服务器上(linux主机),一执行,提示:
can't get stat of ……'' (errcode: 13)
开始还以为是sql文件权限或者是mysql的root用户权限的问题,后来想不对呀,mysql的root用户是超级用户,肯定有权限的,那问题就出在sql文件的权限上,后来把sql的权限改成777,执行操作后还是不行。
网上搜索了一下,有说把文件放在/var/lib/mysql里就行了,一试,果真可以,可是我又不可能在php网页中把sql文件生成放到/var/lib/mysql下,费尽了心思,最后终于在网上搜索到一个解决办法:
使用local将比让服务器直接存取文件慢些,因为文件的内容必须从客户主机传送到服务器主机。在另一方面,你不需要file权限装载本地文件。
你也可以使用mysqlimport实用程序装载数据文件;它由发送一个load data infile命令到服务器来运作。 --local选项使得mysqlimport从客户主机上读取数据。如果客户和服务器支持压缩协议,你能指定--compress在较慢的网络上获得更好的性能。
其实办法简单得很,那就是把load data infile写成load data local infile 就ok啦。
其它类似信息

推荐信息