我正在尝试发出 LOAD DATA LOCAL INFILE 查询,以使用 Rails 3.1.1 下的 mysql2 gem (0.3.11) 将一些 CSV 数据加载到表中:
class Foo < ActiveRecord::Base
def self.load_csv
query = "LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '\n' (title)"
ActiveRecord::Base.connection.execute(query)
end
end
(这是一个示例应用程序,用于重现错误这个 github 问题 https://github.com/brianmario/mysql2/issues/43)。这一直失败在 OS X(Lion)上出现以下错误:
Mysql2::Error: Malformed packet: LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '
' (title)
在服务器上启用本地 infile:
mysql> show variables where variable_name like '%local%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
并在客户端上通过 application.rb 中的此指令:
Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::LOCAL_FILES
相同的 LOAD 语句在 MySQL 客户端上运行良好。将数据库连接方法从套接字更改为 TCP/IP 没有任何区别。 MySql是通过homebrew安装的,版本是
mysql Ver 14.14 Distrib 5.5.15, for osx10.7 (i386) using readline 5.1
我在 Linux 下运行相同的代码不会出现此错误。如果我省略 LOCAL 修饰符,它也可以工作,但这不是一个选项,因为该文件实际上在生产中是本地的,而数据库服务器是远程的。它与文件权限无关,如this https://stackoverflow.com/questions/2420140/malformed-packet-error-during-mysql-load-data-local-infile问题。
这让我发疯,非常感谢任何见解。