2017 年 Ruby on Rails 5 解决 Emoji 报错问题

报错信息是: Mysql2::Error: Incorrect string value: '\xF0\x9F\x98\x84' for column 'wechat_nickname' at row 1: UPDATE `users` SET `wechat_nickname` = '郑诚(Zheng Cheng)😄',

2017 年 Ruby on Rails 5 解决 Emoji 报错问题

报错信息的截图:

emoji

解决方法:

方法来自:http://jasonseifer.com/2014/06/20/rails-4-mysql-and-emoji-mysql2error-incorrect-string-value-error

我试了管用。

第1步:

config/database.yml 里加一条

collation: utf8mb4_unicode_ci

结果如下:

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  encoding: utf8mb4 
  charset: utf8mb4
  collation: utf8mb4_unicode_ci  # <------ 看这里

development:
  <<: *default
  database: apartment_production

第2步:

去 MySQL 里跑:

ALTER TABLE `表名`
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
MODIFY '字段名' VARCHAR(250)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

我跑了2条,改了2个字段

ALTER TABLE `users`
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
MODIFY wechat_nickname VARCHAR(250)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

ALTER TABLE `users`
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
MODIFY username VARCHAR(250)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

问题解决:

emoji2
显示 emoji 没有问题了

2018-7-23 更新

这个问题的根源是 MySQL 的 utf8 有问题。应该使用 utf8mb4
请以后都用 utf8mb4

最近(2018年7月)网上有几篇文章是讲 "程序员遇到的坑"
文章内容就是 MySQL 的 utf8 有问题。
请自行搜索看看,因为我也没收藏地址。我是在公众号里看到了2篇,
其中一篇貌似是曹政 caoz 还是冯大辉的(也可能是我记错了)