2010-03-09 47 views
1

,所以我試圖做到這一點條件與ActiveRecord的空格找到

Order.find :all, :conditions => "org = 'test  org'" 

什麼結束了射擊是

SELECT * FROM `orders` WHERE (org = 'test org') 

在爭論中的空白被剝離。我錯過了什麼..我真的很難過這裏。請幫忙!

+0

這也正是使用'LIKE'尊重空白的MySQL有據可查的特質,其中的'='不:https://bugs.mysql.com/bug.php?id = 64772 –

回答

2

首先打開MySQL中的general query log並查看由MySQL本身接收和執行的查詢是否正確。

這是因爲Rails會squeeze從自己的查詢日誌所有重複空格(開發模式下運行時):

# /rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb 
    def log_info(sql, name, ms) 
    if @logger && @logger.debug? 
     name = '%s (%.1fms)' % [name || 'SQL', ms] 
     @logger.debug(format_log_entry(name, sql.squeeze(' '))) 
    end 
    end 

如果發送到MySQL,根據MySQL查詢查詢日誌本身,仍然是不正確,有再試一次:

Order.find :all, :conditions => [ 'org = ?', 'test  org' ] 
+0

試過這個..我甚至試過find_by_sql,試過:conditions => {:org =>'test org'} – Addy

+0

它的mysql寶石。 mysql(2.8.1) 我會嘗試更新它。但我一直在使用寶石一段時間..從來沒有任何問題。 – Addy

+0

好吧..會試試這個 – Addy

1

這不是rails的問題,而是mysql的行爲方式。

例如:

mysql> select first_name from users where first_name = "George     "; 
+------------+ 
| first_name | 
+------------+ 
| George  | 
| George  | 
+------------+ 
2 rows in set (0.00 sec) 

下面就來解決這個問題的一種方法:

mysql> select first_name from users where BINARY(first_name) = BINARY("George     "); 
Empty set (0.00 sec) 

mysql> select first_name from users where BINARY(first_name) = BINARY("George"); 
+------------+ 
| first_name | 
+------------+ 
| George  | 
| George  | 
+------------+ 
2 rows in set (0.00 sec) 

祝你好運!

+0

查看對其他答案的評論 – Addy

+0

這個例子使用VARCHAR。但是我發現它只適用於尾部空格,所以它不適合操作的例子。 – Gdeglin

+0

ps列是varchar – Addy

相關問題