当前位置: 首页 > 图文教程 > 数据库 > MYSQL > mysql 的load data infile

MYSQL
Windows 2003搭建Apache PHP MySQL环境经验分享
PHP环境配置IIS5.0+PHP5.23+MYSQL5+phpMyAdmin
详解用phpmyadmin建立MYSQL数据库的过程
几条常见的数据库分页 SQL 语句
将MySQL数据导入到Sql Server中
解决MySQL数据库中文模糊检索问题
MySQL索引分析和优化
提高MySQL查询效率的三个有效的尝试
MySQL查询不含周末的五天前的日期
连接MySQL数据库失败频繁的原因分析
SQL Server和MySQL的安全性分析
Linux搭建Discuz论坛的方法
如何保护MySQL中的重要数据
怎样把你的 MySQL 完全中文化
FreeBSD 6.2快速架设网站服务器教程
Oracle限制返回结果集的大小
MySQL中与浮点比较有关问题的解决
distinct在mysql中查询多条不重复记录值的解决办法
全面提升Linux服务器的安全
不能通过mysql.sock连接MySQL问题的方法

MYSQL 中的 mysql 的load data infile


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 68 ::
收藏到网摘: n/a

前些日子在开发一个舆情监测系统,需要在一个操作过程中往数据表里插入大量的数据,为了改变以往生硬地逐条数据插入的笨办法,也为了提高执行效率,决定用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啦。