mysql - 如何通过 Rails 迁移减少存在值的 MySQL 列的 varchar?

标签 mysql ruby-on-rails ruby

我想将表列长度 255 迁移到 191,以将字符集从 utf8 更改为 utf8mb4。

Rails 迁移如下。

  def self.up
    change_column :friend_user_lists, :comment, :string, :limit => 191
  end

我已经将数据库、表和列的字符集更改为 utf8mb4,但出现以下错误。

Mysql::Error: Data truncated for column 'comment' at row 118: ALTER TABLE `friend_user_lists` CHANGE `comment` `comment` varchar(191) DEFAULT NULL

我猜错误表明存在太多长值。
那怎么迁移呢?

最佳答案

如果您可以截断现有的评论记录,那么我会在迁移中这样做:

def self.up
  FriendUserList.where('LENGTH(comment) > 191').each { |r| r.update(comment: r.comment[0...191]) }
  change_column :friend_user_lists, :comment, :string, :limit => 191
end

关于mysql - 如何通过 Rails 迁移减少存在值的 MySQL 列的 varchar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41570682/

相关文章:

php - Mysql查询未按顺序分组

mysql - 如何在 MySQL 中使用变量

ruby-on-rails - 从 CanCan 的 Rails 3.0.9 升级到 Rails 3.1 错误

ruby-on-rails - 生产中的 bundler 不会忽略开发和测试 gem

mysql - 检索相互覆盖的唯一用户的查询

ruby-on-rails - 设计:无法验证服务器上启用的 HTTPS 的 CSRF token 真实性(无 JSON/API)

ruby-on-rails - 使用 Paypal REST API 进行未经授权的访问

ubuntu-12.04 - Ubuntu 12.04 ruby​​ 包安装错误

Ruby 正则表达式错误

mysql - 如何更新具有多个值的表