2010-10-26 22 views
5

je la requête suivante:mysql comparaison binaire index ne marche pas utiliser

EXPLAIN EXTENDED SELECT * 
FROM (
`photo_data` 
) 
LEFT JOIN `deleted_photos` ON `deleted_photos`.`photo_id` = `photo_data`.`photo_id` 
WHERE photo_data.photo_id = 'UKNn' 
AND `deleted_photos`.`photo_id` IS NULL 

Je dois malheureusement utiliser binaire pour le comparer photo_id (qui est remis à moi d'un autre service de l'extérieur). Pour éviter que 'uknn' soit retiré de la base de données au lieu de 'UKNn'.

Le problème est que quand je fais l'expliquer, je vois que l'utilisation de binaire n'utilise pas l'index. Si je sors binaire, il utilise l'index pour photo_id. Existe-t-il un moyen de pouvoir utiliser l'option binaire et d'utiliser un index avec elle?

Répondre

4

MySQL utilise le classement de la colonne pour l'index. Un index avec un classement non binaire n'est pas utile pour une recherche binaire car l'ordre peut être différent.

Vous pouvez changer la colonne elle-même pour un classement binaire:

ALTER TABLE YourTable MODIFY 
    YourColumn VARCHAR(4) 
    CHARACTER SET latin1 
    COLLATE latin1_bin; 

Ensuite, l'indice serait utile pour une recherche binaire.

2

Si vous avez juste besoin de comparer la valeur du champ de manière sensible à la casse - vous pouvez modifier le classement pour ce champ spécifiquement.

ALTER TABLE photo_data MODIFY photo_id VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_bin 

ou

ALTER TABLE photo_data MODIFY photo_id VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_cs 
+0

Y at-il un moyen d'accepter votre réponse aussi? vous avez eu la même réponse à peu près en même temps –