2013-02-04 9 views
8

Ho due tabelle:partita mysql contro non restituisce i risultati di casi insensitive

CREATE TABLE IF NOT EXISTS `test1` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `bucket_id` int(10) unsigned NOT NULL COMMENT 'folder this component belongs to', 
    `test1_name` varchar(81) NOT NULL COMMENT 'Name of this component', 
    `test1_desc` varchar(1024) NOT NULL COMMENT 'Component Description', 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `test1_search` (`test1_name`,`test1_desc`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

CREATE TABLE IF NOT EXISTS `bucket` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `bkt_name` varchar(81) NOT NULL COMMENT 'The name of this bucket', 
    `bkt_desc` varchar(1024) NOT NULL COMMENT 'A description of this bucket', 
    `bkt_keywords` varchar(512) DEFAULT NULL COMMENT 'keywords for searches', 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `fldr_search` (`bkt_desc`,`bkt_keywords`,`bkt_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; 

benna è solo un supporto mentre test1 contiene tutte le cose che andrebbero in un secchio. Per esempio:

INSERT INTO `bucket` (`id`, `bkt_name`, `bkt_desc`, `bkt_keywords`) VALUES 
(1, 'Simpsons', 'The Simpsons Cartoon Family was first successful adult cartoon series', 'Homer, Marge, Lisa and Bart'), 
(2, 'Griffins', 'The family from the popular family guy series', 'Peter, Lois, Meg, Chris, Stewie, Brian'); 

INSERT INTO `test1` (`id`, `bucket_id`, `bkt_name`, `bkt_desc`) VALUES 
(1, 1, 'Homer Simpson', 'Homer the figurative head of the Simpsons Family and is the husband of Marge'), 
(2, 2, 'Peter Griffin', 'Peter the figurative head of the Griffin family on the hit TV seriers The family Guy'); 

Ora, utilizzando la seguente query voglio guardare per tutti i secchi il cui nome, descrizione e parole chiave contengono il termine "famiglia" di ricerca o le cui componenti contengono le parole "famiglia")

Finora, quello che ho è questa query e non restituisce risultati di casi misti come in "Famiglia" non si trova mentre "famiglia" è.

SELECT * 
FROM bucket 
RIGHT JOIN test1 ON test1.bucket_id = bucket.id 
WHERE 
    bucket.isvisible > 0 AND 
    MATCH(bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name) 
    AGAINST('family' IN BOOLEAN MODE) OR 
    MATCH(test1.test1_name, test1.test1_desc) 
    AGAINST('family' IN BOOLEAN MODE) 

Dovrei anche aggiungere che tutti i campi di testo hanno la collazione di utf8_general_ci come fa l'intera tabella che è MyISAM.

+0

L'esempio fornito ha "famiglia" in minuscolo sia nella descrizione del secchio che nella descrizione del test. Puoi fare un esempio migliore per dimostrare il tuo problema? – scwagner

+1

FYI, i nomi dei campi nell'istruzione di inserimento per test1 non sono corretti (dovrebbe essere 'test1_name',' test1_desc'). Anche SELECT ha bucket.isvisible> 0, che non è incluso nella tabella di esempio. Una volta che ho risolto queste due cose, però, la query ha restituito entrambe le righe, quindi purtroppo non conosco la causa del tuo problema reale. (A meno che l'intera faccenda del capitale non sia una falsa pista, e il vero problema è quel parametro bucket.isvisible nella riga dei simpson!) –

+0

Anche tu potresti semplificare la query in questo modo: SELECT * FROM bucket RIGHT JOIN test1 ON test1 .bucket_id = bucket.id DOVE MATCH (bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name, test1.test1_desc, test1.test1_name) CONTRO ('famiglia' IN MODO BOOLEAN) –

risposta

1

La risposta è apparentemente aggiungendo alcuni parenti intorno alle due clausole di confronto.

SELECT * 
FROM bucket 
RIGHT JOIN test1 ON test1.bucket_id = bucket.id 
WHERE bucket.isvisible > 0 AND 
(MATCH(bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name) 
    AGAINST('family' IN BOOLEAN MODE) OR 
    MATCH(test1.test1_name, test1.test1_desc) 
    AGAINST('family' IN BOOLEAN MODE)) 
+0

OMG! Sì, questo a causa della precedenza degli operatori (http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html) ... Senza parents, la tua condizione era equivalente a 'WHERE (isvisible> 0 AND MATCH (...)) O (MATCH (...)) ' – RandomSeed

2

Penso che le tabelle non utilizzino lo utf8_general_ci come confronto, ma utf8_bin. Sono stato in grado di riprodurre il comportamento descritto dopo aver modificato le tabelle come segue:

ALTER TABLE test1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 
ALTER TABLE bucket CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 

Si dovrebbe forse impostare le regole di confronto le tabelle esplicitamente a:

ALTER TABLE test1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
ALTER TABLE bucket CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

Se quanto sopra qualcosa cambia, direi il tuo server o sessione è effettivamente impostato per utilizzare altre regole di confronto per impostazione predefinita (poiché le regole di confronto non sono specificate nella definizione delle tabelle). Questo potrebbe essere verificato con:

SHOW GLOBAL VARIABLES LIKE 'collation_server'; 
SHOW SESSION VARIABLES LIKE 'collation_server'; 
+0

Utilizzando phpMyAdmin tutti i campi E le tabelle mostrano le regole di confronto come utf8_general_ci. Se esporto le tabelle, il comando COLLATE è impostato su utf8_general_ci. – ppetree

+0

Anche le istruzioni SHOW restituiscono utf8_unicode_ci – ppetree