To support emoticons in a MySQL database you must use the utf8mb4 character set.
This isn't a rails default.
To make sure the database uses the correct format I use the following migration to change the default charcter set
class InitDatabase < ActiveRecord::Migration[5.2]
def up
execute "ALTER DATABASE `#{connection.current_database}` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
end
end
More info about the reason why I choose to use utf8mb4_unicode_ci as collection
https://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci/766996#766996
And force rails in using max string length of 191 which is required for the keylength of 767.
You can add the following monkey patch to the initializer
# config/initializers/monkey_patch_mysql_utf8mb4.rb
require 'active_record/connection_adapters/abstract_mysql_adapter'
module ActiveRecord
module ConnectionAdapters
class AbstractMysqlAdapter
NATIVE_DATABASE_TYPES[:string] = { name: "varchar", limit: 191 }
end
end
end