Rails 3, mysql y UTF-8


Empezaron a trabajar con rails 3? Se dieron cuenta que las bases de datos con encoding UTF-8 no funcionan tan bien como esperan? Esto es porque la gema “mysql” trabaja con ASCII-8BIT encoding, pero ruby 1.9 y rails 3 trabajan con UTF-8, así que cuando crean un modelo se graba en la base de datos, pero cuando recuperan esos modelos de la base de datos, no muestra la información que uds. originalmente grabaron.
Cual es la solución? Bueno, hay 3, la más recomendada, usar la gema “mysql2″, para esto, editen el archivo Gemfile para incluirla:

gem "mysql2"

Y luego editen databases.yml y cambien el adaptador a mysql2

development:
  adapter: mysql2
  database: fun_development
  user: root
  password:
  encoding: utf8

Otra solución, es simplemente en vez de usar la gema “mysql” usen la gema “ruby-mysql”, pero es muy lenta porque es una gema 100% ruby.

gem "ruby-mysql"

La última solución, es un monkey patch para seguir utilizando la gema mysql, pero también es lenta, así que de nuevo, recomiendo usar la gema mysql 2.

require 'mysql'

class Mysql::Result
  def encode(value, encoding = "utf-8")
    String === value ? value.force_encoding(encoding) : value
  end

  def each_utf8(&block)
    each_orig do |row|
      yield row.map {|col| encode(col) }
    end
  end
  alias each_orig each
  alias each each_utf8

  def each_hash_utf8(&block)
    each_hash_orig do |row|
      row.each {|k, v| row[k] = encode(v) }
      yield(row)
    end
  end
  alias each_hash_orig each_hash
  alias each_hash each_hash_utf8
end
Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
This entry was posted in Ruby. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>