【问题标题】:Rails migration for VARCHAR -> VARCHAR BINARY for case-sensitivity用于 VARCHAR -> VARCHAR BINARY 的 Rails 迁移以区分大小写
【发布时间】:2013-01-09 20:04:01
【问题描述】:

我想将现有的 MySQL 列从 VARCHAR 更改为 VARCHAR BINARY,以便将其更改为区分大小写(请参阅:https://stackoverflow.com/a/3396315/93995

什么是正确的迁移语法?我试过了

change_column :my_table, :my_column, :binary, :limit => 255

但这会尝试将其更改为blob(255)。还抱怨:

Mysql2::Error: BLOB/TEXT column 'my_column' used in key specification without a key length:   ALTER TABLE `my_table` CHANGE `my_column` `my_column` blob(255) DEFAULT NULL

【问题讨论】:

  • 您需要指定 Rails 迁移不支持的 'utf8_bin' 排序规则。您只想更改该列,还是表中的所有列都区分大小写?
  • 我只想更改指定列。

标签: mysql ruby-on-rails-3


【解决方案1】:

要将单个列更改为区分大小写,您需要直接使用 SQL DDL 将排序规则更改为“utf8_bin”:

def up
 execute("ALTER TABLE my_table MODIFY `my_column` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin;")
end

请注意,这仍然使用 'varchar' 类型作为存储,只有排序规则(解释的含义)被定义为 'binary' 用于比较目的。另请注意,您可能无法比较具有不同排序规则的列,因此请确保这是您真正想要的。

如果您想让整个表格使用特定的排序规则,这很容易做到:

create_table :my_table, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin' do |t|
  t.string :my_column
  t.string :my_other_column
end

【讨论】:

  • 我将此解决方案与执行命令一起使用。但有一件事让我担心。当我查看架构文件时,它没有说明此更改列的排序规则。如果我要使用 rake db:schema:load 从头开始​​创建数据库,而不是进行迁移,会发生什么情况。那么这个改变不会被应用吧?
  • @Jepzen 正确,ActiveRecord 不正确支持列级排序规则设置 :(。这很有趣,因为有 属性是 holds the specified collation。请注意,您赢了'如果切换到使用the :sql dump 格式,则不会出现此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2011-09-20
  • 2010-10-23
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多