2010-03-09 5 views
1

donc je suis en train de le faireavec activerecord à trouver des espaces blancs

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

ce qui finit par tir est

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

les espaces dans l'argument se dépouilla. Qu'est-ce que je manque ... im vraiment perplexe ici. aidez s'il vous plaît!

+0

C'est une idiosyncrasie bien documenté de MySQL où l'utilisation 'LIKE' respecte les espaces blancs alors que' '= ne fonctionne pas: https://bugs.mysql.com/bug.php?id = 64772 –

Répondre

2

D'abord activer le general query log dans MySQL et voir si la requête, telle que reçue et exécutée par MySQL elle-même, est correcte.

C'est parce que Rails squeeze tout double des espaces de ses propres journaux de requêtes (en cours d'exécution en mode développement):

# /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 

Si la requête envoyée à MySQL, en fonction de la requête MySql journal lui-même, est encore incorrect, essayez à nouveau avec:

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

essayé ceci .. j'ai même essayé find_by_sql, essayé: conditions => {: org => 'test org'} – Addy

+0

son mysql gem. mysql (2.8.1) Je vais essayer de le mettre à jour. mais j'ai utilisé la gemme pendant un moment .. n'a jamais eu de problème. – Addy

+0

ok .. va essayer ce – Addy

1

Ce n'est pas un problème avec les rails, mais plutôt un comportement de mysql.

Par exemple:

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

est ici une façon de le fixer:

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) 

Bonne chance!

+0

voir le commentaire sur une autre réponse – Addy

+0

Cet exemple utilise VARCHAR. Cependant, je vois que cela ne s'applique qu'aux espaces de fin, donc cela ne correspond pas à l'exemple de l'op. – Gdeglin

+0

ps la colonne est varchar – Addy

Questions connexes