How to save Ruby object as a blob in MySQL

  • Thread starter Bryan Richardson
  • Start date
B

Bryan Richardson

Hello all,

I'm using Ruby and Sequel on Windows to talk to a database on a Linux
machine. The Sequel-to-MySQL connection is working fine -- I can save
and query for data no problems. However, I'm trying to save a Ruby
object (an Array at this point) as a blob in the MySQL database and when
I do I get some crazy stuff going on. The code I am running is below:

require 'rubygems'
require 'sequel'

DB = Sequel.connect 'mysql://test:[email protected]/sequel'

DB.create_table :items do
column :name, :text
column :stuff, :blob
end

test = Array.new
test << 145.0
test << 231.56

b = Marshal.dump(test)

items = DB[:items]
items << { :name => 'Test', :stuff => b }

When I run this I get no errors at all. However, when I move over to my
Linux machine where the MySQL server is running and do a 'select * from
items' query it looks like the blob data is overflowing out of the table
and my command line gets all jacked up (see the attachment). The
command line stays jacked up even after I exit out of the mysql client
console.

Any ideas on why this is happening and more importantly how I can
successfully marshal a Ruby object to my database?!

--
Thanks!
Bryan

Attachments:
http://www.ruby-forum.com/attachment/2649/ss.png
 
M

Michael Libby

Hello all,

I'm using Ruby and Sequel on Windows to talk to a database on a Linux
machine. The Sequel-to-MySQL connection is working fine -- I can save
and query for data no problems. However, I'm trying to save a Ruby
object (an Array at this point) as a blob in the MySQL database and when
I do I get some crazy stuff going on. The code I am running is below:

require 'rubygems'
require 'sequel'

DB = Sequel.connect 'mysql://test:[email protected]/sequel'

DB.create_table :items do
column :name, :text
column :stuff, :blob
end

test = Array.new
test << 145.0
test << 231.56

b = Marshal.dump(test)

items = DB[:items]
items << { :name => 'Test', :stuff => b }

When I run this I get no errors at all. However, when I move over to my
Linux machine where the MySQL server is running and do a 'select * from
items' query it looks like the blob data is overflowing out of the table
and my command line gets all jacked up (see the attachment). The
command line stays jacked up even after I exit out of the mysql client
console.

Any ideas on why this is happening and more importantly how I can
successfully marshal a Ruby object to my database?!

Are you sure it's not marshaling correctly? What happens when you
select that data back out and do Marshal::load ? The problem is more
likely your Linux terminal software following instructions you didn't
intend to give it.

If you examine the contents of b in your test code, you'll see some
pretty interesting values in there, and one of them is probably
messing up your display when you do your select statement in the mysql
client. This sort of thing happens all the time when dumping raw
binary data to a terminal. And while Marshal::dump returns a string,
it's really binary data.

irb(main):001:0> test = [145.0, 231.56]
=> [145.0, 231.56]
irb(main):002:0> b = Marshal.dump(test)
=> "\004\b[\af\b145f\016231.56\000\270R"

In most Linux terminals, you can use the 'reset' command to recover
when it gets garbled like this.

-Michael
 
B

Bryan Richardson

Thanks Michael... you are correct on both accounts. I actually made a
mistake in my syntax that made me think it wasn't reading back in
correctly.
 
E

Ezra Zygmuntowicz

Thanks Michael... you are correct on both accounts. I actually made a
mistake in my syntax that made me think it wasn't reading back in
correctly.


In general when you want to store Marshal'd data in mysql you should
Base64.encode the data after you Marshal.dump it so that you do not
get those weird chars and mysql is better able to handle the data.

-Ezra
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,050
Latest member
AngelS122

Latest Threads

Top