【问题标题】:Malformed packet error during MySQL LOAD DATA LOCAL INFILEMySQL LOAD DATA LOCAL INFILE 期间出现格式错误的数据包错误
【发布时间】:2010-03-10 20:02:03
【问题描述】:

我正在尝试使用 PHP 的 mysqli::queryLOAD DATA LOCAL INFILE 查询将文件加载到 MySQL(v5.1.38) innodb 表中。查询返回“格式错误的数据包”错误代码 2027。任何想法有什么问题?

这里是目标表:

CREATE TABLE  `zbroom`.`lee_datareceive` (
  `a` varchar(45) NOT NULL,
  `b` varchar(45) NOT NULL,
  `c` varchar(45) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这里是查询:

LOAD DATA LOCAL INFILE '/path/to/file.txt'
    INTO TABLE lee_datareceive
    FIELDS TERMINATED BY '\t';

这是文件数据。值以制表符分隔:

t1  t2  t3
a   b   c
d   e   f
g   h   i

【问题讨论】:

  • 只有在 PHP 中使用时才会失败吗?如果你从 MySQL 命令行客户端运行它是否有效?
  • @Mark Byers:从命令行可以正常工作。
  • php 是作为匿名系统用户运行(例如nobodywww-data),还是作为您的用户名运行?
  • @Tim Post:PHP 以nobody 运行。
  • 可能是权限问题。请参阅 Rob 的回答和我对权限的评论。

标签: php mysql


【解决方案1】:

同样的问题。是权限问题。

从 php 执行 shell:

'mysql --user=root --password=zxc db < /stuff.sql'

stuff.sql

LOAD DATA LOCAL INFILE '/stuff.csv' INTO TABLE `stuff` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'

格式错误的数据包错误。

解决方案:

chmod 777 /stuff.csv

PHP 以自己的权限级别运行,而 mysql 没有获得对 stuff.csv 的读取权限

如果你讨厌chmod 777,你会得到一个cookie

【讨论】:

  • 644 就足够了 :) 777 表示用户、组和整个世界都可以读取、写入和执行文件。你几乎从不想要那样。
  • 在我的情况下,更改权限是不够的。我最终从 PHP 调用了一个本地 Perl 脚本。当然,后来我在管道结果方面遇到了困难,但那是另一回事!
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2013-10-09
  • 2018-03-03
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多