我正在尝试发出 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
(这是重现 this github issue 错误的示例应用程序)。这在 OS X (Lion) 上一直失败,并出现以下错误:
Mysql2::Error: Malformed packet: LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '
' (title)
本地文件在服务器上启用:
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问题。
这让我抓狂,非常感谢任何见解。
最佳答案
应该为 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)
关于mysql - LOAD DATA LOCAL INFILE 导致 mysql2 gem 出现 Malformed packet error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8790874/