ruby

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是否有这个问题..结果是没这个问题.唉.

参考

  1. 清官谈mysql中utf8和utf8mb4区别
  2. Mysql2::Error: Incorrect string value
上一篇 下一篇

猜你喜欢

热点阅读