Skip to content

Instantly share code, notes, and snippets.

@russ
Created December 27, 2010 21:41
Show Gist options
  • Save russ/756585 to your computer and use it in GitHub Desktop.
Save russ/756585 to your computer and use it in GitHub Desktop.
class ConvertDatabaseToUtf8 < ActiveRecord::Migration
def self.up
db_config = ActiveRecord::Base.connection.instance_values["config"]
db_name = db_config[:database]
db_user = db_config[:username]
db_pass = db_config[:password] || ''
latin1_dump = 'latin1_dump.sql'
utf8_dump = 'utf8_dump.sql'
print "Dumping database... "
system "mysqldump --user=#{db_user} --password='#{db_pass}' --add-drop-table --default-character-set=latin1 --insert-ignore --skip-set-charset #{db_name} | sed 's/“/\"/' | sed 's/”/\"/' > #{latin1_dump}"
puts "done"
print "Replacing Smart Quotes... "
replace_path = "/usr/local/mysql/bin/replace"
#replace_path = "/opt/local/lib/mysql5/bin/replace"
system "#{replace_path} 'Â' '' '¡' '&#161;' '\342\200\230' '&#8216;' '\342\200\231' '&#8217;' '\342\200\234' '&#8220;' '\342\200\235' '&#8221;' '\303\302' '' '\302\241' '&#161' '\303\203\302\255' i '\303\242\357\277\275' '&#8220;' '\303\242\357\277\275\302\235' '&#8220;' '\303\242\302\200\302\234' '&#8221;' -- #{latin1_dump}"
print "Converting dump to UTF8... "
system "iconv -f latin1 -t utf8 #{latin1_dump} | sed 's/latin1/utf8/' | sed 's/COLLATE=latin1_general_ci/COLLATE=utf8_general_ci/' > #{utf8_dump}"
puts "done"
print "Recreating database..."
system "mysql --user=#{db_user} --password='#{db_pass}' --execute=\"DROP DATABASE #{db_name};\""
system "mysql --user=#{db_user} --password='#{db_pass}' --execute=\"CREATE DATABASE #{db_name} CHARACTER SET utf8 COLLATE utf8_general_ci;\""
puts "done"
print "Importing UTF8 dump..."
system "mysql --user=#{db_user} --password='#{db_pass}' --default-character-set=utf8 #{db_name} < #{utf8_dump}"
puts "done"
puts " *** don't forget to delete temp files #{latin1_dump} and #{utf8_dump}"
end
def self.down
raise ActiveRecord::IrreversibleMigration, "Can't revert UTF8 migration."
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment