Rails 3, mysql and UTF-8


So, have you started to work with rails 3? Did you realize that your UTF-8 databases doesn’t work nice with mysql? This is because the mysql gem works with ASCII-8BIT encoding, but ruby 1.9 and rails 3 works with UTF-8 encoding, so when you create a model into the database, everything works fine, but when you work with those models, it doesn’t works so nice and you don’t get what you stored.
What’s the solution? Well, there are actually three solutions, the most recommended, use mysql2, in order to do this, edit your Gemfile and include:

gem "mysql2"

and then, edit your databases.yml file, and change the adapter to mysql2

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

Another solution, is just instead of using the “mysql” gem, use the “ruby-mysql” gem, but it’s pretty slow because it’s a 100% ruby gem.

gem "ruby-mysql"

The last solution is a monkey patch, but its also slow to use it, so I really recommend using the mysql 2 gem

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

10 thoughts on “Rails 3, mysql and UTF-8”

  1. 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?

  2. 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

  3. 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.

  4. Guys please guide me where i need to patch this

    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

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>