mysql utf8 遇到 emoji的坑
2017-10-17 本文已影响74人
6593443e12c1
最近项目遇到1个bug
微信登录绑定账号时候有一些用户会莫名其妙的绑定失败(初次注册绑定过程中会修改用户名).
调试时候一直以为是代码的问题,逻辑怎么看怎么没问题.
但是状况还是时有发生.
正巧今天有1个新用户注册遇到了.
执行的sql与得到错误
INSERT INTO `users` (`created_at`, `updated_at`, `username`, `wechat_open_id`, `avatar`, `is_724member`) VALUES ('2017-10-17 11:44:17', '2017-10-17 11:44:17', '四季风景🦁', 'xxxxxxxxxxxxxx', '0.jpeg', 0);
ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\xA6\x81' for column 'username' at row 1
搜索错误发现原来是mysql编码的问题
清官谈mysql中utf8和utf8mb4区别, 默认的编码utf8不支持emoji符号
rails项目解决办法
新建迁移文件
class MigrateDatabaseCollate < ActiveRecord::Migration[5.0]
def change_encoding(encoding,collation)
connection = ActiveRecord::Base.connection
tables = connection.tables
dbname =connection.current_database
execute <<-SQL
ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation};
SQL
tables.each do |table_name|
execute <<-SQL
ALTER TABLE #{dbname}.#{table_name} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation};
SQL
end
end
def change
reversible do |dir|
dir.up do
change_encoding'utf8mb4', 'utf8mb4_bin'
end
dir.down do
change_encoding'utf8', 'utf8_unicode_ci'
end
end
end
end
结尾顺手搜了下pg是否有这个问题..结果是没这个问题.唉.
参考