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)😄',
报错信息的截图:
解决方法:
方法来自: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;
问题解决:
显示 emoji 没有问题了
2018-7-23 更新
这个问题的根源是 MySQL 的 utf8 有问题。应该使用 utf8mb4
请以后都用 utf8mb4
最近(2018年7月)网上有几篇文章是讲 "程序员遇到的坑"
文章内容就是 MySQL 的 utf8 有问题。
请自行搜索看看,因为我也没收藏地址。我是在公众号里看到了2篇,
其中一篇貌似是曹政 caoz 还是冯大辉的(也可能是我记错了)