2013-04-17 33 views
4

我有模型Item和Location。爲什麼Rails在創建新記錄時在SQL查詢中生成BINARY

這是項目模型我的移民文件:

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 

爲什麼SQL已BINARY在項目存在行?我插入一個字符串在窗體上創建item_cd。任何人都可以告訴我什麼問題是?

我正在使用mysql數據庫。

回答

6

看起來你有一個像

validates :item_cd, :uniqueness => true 

模型中的一些驗證很顯然,這將使模型檢查在DB相等的值,因此Exist查詢的存在。

爲什麼在比較之前將字符串'6'強制轉換爲二進制的原因是對於charvarchar值的二進制比較更快。通常比較將通過整理過程,以便(例如)'6'='6'或'a'='A'。由於查詢只需要檢索完全匹配(並且不是值,只是它們的存在:SELECT 1),所以二進制比較就足夠了。

你也可以看看相關的MySQL文檔: http://dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html

+0

謝謝你,你給我有用的信息。 – Thanh

相關問題