LOAD DATA LOCAL INFILE使用mysql2 gem导致格式错误的数据包错误

我正在尝试发出一个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问题的错误的示例应用程序)。 这在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 

从MySQL客户端可以正常运行相同的LOAD语句。 将数据库连接方法从套接字更改为TCP / IP没有任何区别。 MySql是通过自制软件安装的,版本是

 mysql Ver 14.14 Distrib 5.5.15, for osx10.7 (i386) using readline 5.1 

我不会在Linux下运行相同的代码时出现此错误。 如果省略LOCAL修饰符,它也可以工作,但这不是一个选项,因为文件实际上是生产本地的,而数据库服务器是远程的。 它与此问题中的文件权限无关。

这让我疯狂,任何见解都非常感激。

应该为mysql2 v> 0.3.12b4修复问题

它对我使用LOCAL_FILE标志不起作用,但在选项中添加:local_infile => true就可以了

 1.9.3p194 :011 > a = Mysql2::Client.new(:username=>'root', :host=>'localhost', :password=>'', :database=>'bhl_indexer', :local_infile => true) 

https://github.com/brianmario/mysql2/issues/293

事实certificate,这可以通过重新安装mysql2 gem来解决。 我想我已经安装了一个从源代码编译的MySQL版本,然后切换到通过brew安装的MySQL,这导致gem使用的客户端代码不兼容。 这解释了为什么它从命令行客户端工作,但在使用gem时没有。

 gem uninstall mysql2 gem install mysql2 

卫生署…