Rorra's blog Senior Developer

julio 30, 2010

Rails 3, mysql y UTF-8

Filed under: Ruby — admin @ 3:01 PM


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

7 comentarios »

  1. Thanks a lot!!!

    Comentario by Thiago — noviembre 21, 2010 @ 8:06 PM

  2. [...] rapide passage sur StackOverflow m’a mené vers l’article suivant où il est mentionné que le gem mysql n’est pas compatible avec l’encodage UTF-8. Et [...]

    Pingback by [Rails 3] Méfiez vous du gem mysql ! « FIX YOUR CODE — marzo 9, 2011 @ 9:24 PM

  3. Thanks for your article. It helps me a lot!

    Comentario by david — abril 20, 2011 @ 10:25 AM

  4. Buenos días, soy nuevo en rails, vengo de .net y me cuesta un poco, estoy buscando una forma de que se creen los modelos automáticamente en rails, debido a que tengo una base de datos de muchas tablas, estuve leyendo que el Magic Model Generator in Rails no funciona en rails 3, conoces alguna forma de hacer esto?

    Comentario by Luis — mayo 5, 2011 @ 12:37 PM

  5. Es que si tenes una base de datos con muchas tablas, y generas los modelos, tarde o temprano vas a terminar utilizando esos modelos de alguna manera, por ende, no veo razón para generarlo automáticamente.
    Generar un modelo por cada tabla no es un gran lío, si tu tabla se llama “clients”, basta con hacer
    class Client < ActiveRecord::Base
    end
    y listo, ya tenes tu modelo, el tema esta en implementar las relaciones con otras tablas (en especial si tus tablas no siguen el estandard de rails) y si tenes nombres no estandarizados, vas a terminar haciendo cosas como:
    class Client < ActiveRecord::Base
    set_table_name "cliente"
    has_many :users, :foreign_key => “USER_ID”
    end
    que igual sigue siendo algo muy sencillo.
    Por otro lado, el tema de activerecord, como definir los modelos, las relaciones, y demás, suponiendo que tengas unas 100 tablas, no debería de llevarte más de 30-60 minutos, te recomiendo que hagas todo el tutorial que viene en el libro “agile web development with rails”, que te leas bien el capitulo más adelante en el libro sobre ActiveRecord y recién ahí escribas los modelos para tu base de datos, porque lo que tenes que hacer es realmente algo muy sencillo de hacer en rails si tenes los conocimientos básicos del framework.
    Saludos

    Comentario by admin — mayo 6, 2011 @ 11:37 AM

  6. So are you saying that the database created with MySQL has to be created as UTF-8 database in order to work correctly with Ruby 1.9 and Rails 3.x ?

    Comentario by Web Hosting — octubre 7, 2011 @ 10:26 AM

  7. No, I’m saying that in order to support multi character encoding in rails 3 with utf8 (i.e: êûáú) you need the mysql2 gem, while on rails 2 applications you didn’t have any trouble by using the mysql gem.

    Comentario by admin — octubre 7, 2011 @ 2:39 PM

RSS feed para los comentarios de esta entrada. TrackBack URL

Deja un comentario

Powered by WordPress