5

我有模型项目和位置。

这是我的项目模型迁移文件:

class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|
      t.string :item_cd
      t.string :item_name

      t.integer :location_id
      t.timestamps
    end
  end
end

我使用 form_tag 创建一个用于创建新项目的表单。但是当我创建新项目时,Rails 会生成如下 SQL:

Location Load (0.3ms)  SELECT `locations`.* FROM `locations` WHERE `locations`.`location_cd` = 'jp' LIMIT 1
  Item Load (0.2ms)  SELECT `items`.* FROM `items` WHERE `items`.`item_cd` = '6' LIMIT 1
   (0.1ms)  BEGIN
  Item Exists (0.2ms)  SELECT 1 FROM `items` WHERE `items`.`item_cd` = BINARY '6' LIMIT 1
  SQL (0.6ms)  INSERT INTO `items` (`created_at`, `item_cd`, `item_name`, `location_id`, `updated_at`) VALUES ('2013-04-17 03:26:42', '6', 'Glasses', 12, '2013-04-17 03:26:42')
   (27.6ms)  COMMIT

为什么 SQLBINARY在 Item Exists 行中有?我插入一个字符串以在表单上创建 item_cd。谁能告诉我什么问题?

我正在使用mysql数据库。

4

1 回答 1

7

看起来您的模型中有一些验证,例如

validates :item_cd, :uniqueness => true

显然,这将使模型检查数据库中是否存在相等的值,因此Exist查询。

在比较之前将字符串 '6' 转换为二进制的原因是二进制比较对charvarchar值更快。通常,比较将通过整理过程,以便(例如)'6' = '6' 或'a' = 'A'。由于查询只需要检索完全匹配(也不是值,只是它们的存在:SELECT 1),因此二进制比较就足够了。

您还可以查看相关的 MySQL 文档: http ://dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html

于 2013-04-17T09:02:51.143 回答