• User Attivo

    [MySql]Esperti Aiuto! Full text evitare case sensitive in presenza di dati binari

    Ciao a tutti!

    Mi sono imbattuto in un megaproblemone MySql! :arrabbiato:

    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.


  • User Attivo

    Per quale motivo vuoi fare una ricerca FULL TEXT su dei campi di tipo INT?


  • User Attivo

    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.


  • User Attivo

    @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! :fumato:


  • User Attivo

    @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?


  • User Attivo

    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.


  • User Attivo

    [...]

    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.