- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- [MySql]Esperti Aiuto! Full text evitare case sensitive in presenza di dati binari
-
[MySql]Esperti Aiuto! Full text evitare case sensitive in presenza di dati binari
Ciao a tutti!
Mi sono imbattuto in un megaproblemone MySql!
Quando si fa una full text search BOOLEANA
del tipo:
.... WHERE MATCH('animale') AGAINST ('cane' IN BOOLEAN MODE)
tutto funziona a meraviglia e la ricerca non è case sensitive.
Il problema è che, se nella ricerca inserisco anche campi binari (ad esempio un campo INT) la ricerca diventa automaticamente case sensitive.
Quindi se ad esempio cerco:
WHERE MATCH('id_animale','animale') AGAINST ('cane' IN BOOLEAN MODE)Se cerco "cane" (e ovviamente ho una voce corrispondente) MySql mi restituisce una riga.
Se invece cerco "Cane" la ricerca non restituisce risultati.
Ho letto un po' la documentazione ed ho scoperto che esiste un modo per leggere i dati convertendoli: esempio leggere un binario come stringa.
Infatti esistono le funzioni CAST() e CONVERT()
Il problema è che non riesco ad implementarle con la query di MATCH e AGAINST.
Vi prego aiutatemi prima che mi ricoverino!!! x:x
Grazie.
-
Per quale motivo vuoi fare una ricerca FULL TEXT su dei campi di tipo INT?
-
Non puoi utilizzare a priori sia per inserire che per cercare delle convenzioni con il linguaggio di programmazione usato??
Dovrebbe bastare convertire la stringa in minuscolo o maiuscolo.
-
@filippotoso said:
Per quale motivo vuoi fare una ricerca FULL TEXT su dei campi di tipo INT?
Perchè ho dei codici e dei campi di testo nella stessa tabella e voglio effettuare una ricerca sia tramite codice che tramite testo dallo stesso campo di ricerca.
Comunque a posto ho risolto:
in pratica quando metti nella stessa funziona MySql dei campi con charset / collation diverse, vengono tutte automaticamente lette come binary, di conseguenza la ricerca sulle stringhe diventa invevitabilmente case sensitive.
Mi è bastato dividere la query in 2 funzioni una per i numeri binari ed una per le stringhe.
In questo modo:
SELECT ".primary_key($v)." FROM ".$v." WHERE MATCH(codice,altro_dato_numerico,altro_dato_binario) AGAINST ('".$search_keys."' IN BOOLEAN MODE) OR MATCH(nome,cognome,indirizzo) AGAINST ('".$search_keys."' IN BOOLEAN MODE)
Meno male!
-
@visitaci said:
Non puoi utilizzare a priori sia per inserire che per cercare delle convenzioni con il linguaggio di programmazione usato??
Dovrebbe bastare convertire la stringa in minuscolo o maiuscolo.
Questo funzionerebbe solo se le stringhe avessero una regola
es. prima maiuscola - tutte maiuscole - tutte minuscole.
Ma io non voglio creare limitazioni.
Se voglio scrivere cAne devo essere libero di farlo, non trovi?
-
Fai una differenza a livello logico tra Cane e CANE??
Se ciò non fosse non vedo perchè non puoi utilizzare funzioni come strtoupper o simili prima di effettuare la query.
In questo modo l'utente può inserire CaNe, CANE, cane, ma il risultato sarà sempre uno e l'utente sarà allo scuro di tutto.
-
[...]
Allora, facciamo un esempio:
nel database ho una voce registrata:
cAne
Faccio la ricerca e scrivo:
cane
se applico uno strtoupper
quindi cerco
CANE
In realtà per trovare cAne, leggendo il tutto come dati binari devi solo cercare
cAne
Ciò presupporrebbe che io al momento della ricerca già conosca esattamente cosa sto cercando.
Non restituisce risultato.