Skip to content

Instantly share code, notes, and snippets.

@amuntasim
Last active June 2, 2022 21:06
Show Gist options
  • Save amuntasim/f3b12f20a30e9a9f3fb0 to your computer and use it in GitHub Desktop.
Save amuntasim/f3b12f20a30e9a9f3fb0 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# Put this file in the root of your Rails project,
# then run it to output the SQL needed to change all
# your tables and columns to the same character set
# and collation.
#
# > ruby character_set_and_collation.rb
CHARACTER_SET = 'utf8'
COLLATION = 'utf8_general_ci'
schema = File.open('db/schema.rb', 'r').read
rows = schema.split("\n")
table_name = nil
rows.each do |row|
if row =~ /create_table/
table_name = row.match(/create_table "(\w+)"/)[1]
puts "ALTER TABLE `#{table_name}` DEFAULT CHARACTER SET #{CHARACTER_SET} COLLATE #{COLLATION};"
elsif row =~ /t\.string/
field_name = row.match(/"(\w+)"/)[1]
limit = row =~ /limit:\s*(\d*)/ ? row.match(/limit:\s*(\d*)/)[1] : 255
puts "ALTER TABLE `#{table_name}` CHANGE `#{field_name}` `#{field_name}` VARCHAR(#{limit}) CHARACTER SET #{CHARACTER_SET} COLLATE #{COLLATION};"
elsif row =~ /t\.text/
field_name = row.match(/"(\w+)"/)[1]
if row =~ /limit:\s*(\d*)/
limit = row.match(/limit:\s*(\d*)/)[1]
puts "ALTER TABLE `#{table_name}` CHANGE `#{field_name}` `#{field_name}` TEXT(#{limit}) CHARACTER SET #{CHARACTER_SET} COLLATE #{COLLATION};"
else
puts "ALTER TABLE `#{table_name}` CHANGE `#{field_name}` `#{field_name}` TEXT CHARACTER SET #{CHARACTER_SET} COLLATE #{COLLATION};"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment