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

Thi*_*ilo 5 mysql macos ruby-on-rails mysql2 ruby-on-rails-3

我正在尝试发出一个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
Run Code Online (Sandbox Code Playgroud)

(这是一个重现此github问题的错误的示例应用程序).这在OS X(Lion)上出现故障,并出现以下错误:

Mysql2::Error: Malformed packet: LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '
' (title)
Run Code Online (Sandbox Code Playgroud)

服务器上启用了本地infile:

mysql> show variables where variable_name like '%local%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

并在application.rb上通过此指令在客户端上:

Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::LOCAL_FILES
Run Code Online (Sandbox Code Playgroud)

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

mysql  Ver 14.14 Distrib 5.5.15, for osx10.7 (i386) using readline 5.1
Run Code Online (Sandbox Code Playgroud)

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

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

Thi*_*ilo 0

事实证明,通过重新安装 mysql2 gem 就可以简单地解决这个问题。我想我是用源码编译的MySQL版本安装的,后来又切换到通过brew安装的MySQL,这导致gem使用的客户端代码不兼容。这就解释了为什么它可以在命令行客户端上工作,但在使用 gem 时却不能工作。

gem uninstall mysql2
gem install mysql2
Run Code Online (Sandbox Code Playgroud)

嚯……