Query case sensitive

Un saluto,

cerco di andare per ordine perché la problematica non affatto semplice da descrivere.

$query = "SELECT * FROM `volumi` WHERE `titolo` LIKE '".$titolo."%' ORDER BY 'ordine' DESC";

Attraverso questa query ottengo un risultato differente se scrivo George oppure george la qual cosa ovviamente crea problemi.

Mi sembra di aver capito che la cosa dipenda dal modo in cui il database è stato importato, io ho usato come da indicazioni raccattate sulla rete la seguente collation:

latin1_general_ci

Questo perché il database comprende molti autori stranieri con relativi caratteri, purtroppo nonostante vari tentativi al cambiare del set di caratteri non ottengo differenze nella quesry.

Oltre ad avvertire gli utenti che la ricerca è Case Sensitive posso provare qualche altra strada ?

PHP Version 5.1.6
Linux Web.linux 2.6.18-238.9.1.el5PAE
Apache/2.2.3
Mysql 5.0.95

Enrico

Ma nel db come sono salvati i nomi? Tutti in maiuscolo o tutti in minuscolo?
Se sono salvati tutti in un sol modo puoi passare una versone “corretta” del parametro, ad esempio tutto in maiuscolo con l’http://www.sastgroup.com/tutorials/convertire-una-stringa-in-uppercase-con-php (questo se usi php, ma dovrebbe essere disponibile per tutti i linguaggi)

Nel database i nomi sono inseriti correttamente ovvero in questa maniera:

Enrico
oppure

Enrico Maria
oppure

Enrico Maria Biondi

e questo vale anche per i titoli.

ciao, il mio “corretta” era da intendersi come “modificata”, non che la tua soluzione fosse sbagliata :wink:

A me avere i dati nel db con il camel case non piace, preferisco o tutto in minuscolo o tutto in maiuscolo, ma capisco che se i dati sono già presenti ci devi convivere.

Se la prima lettera del nome è comunque salvata in maiuscolo potresti mettere nel codice di controllare la prima lettera, se è minuscola la rende maiuscola altrimenti non fa niente.

Alternativa (migliore), verifica se nel mysql non esista la possibilità di passare un “ignorecase”, cioè qualche cosa di simile a:

$query = WHERE `titolo` LIKE 'ignorecase(".$titolo.");

[quote=cisko]ciao, il mio “corretta” era da intendersi come “modificata”, non che la tua soluzione fosse sbagliata :wink:

A me avere i dati nel db con il camel case non piace, preferisco o tutto in minuscolo o tutto in maiuscolo, ma capisco che se i dati sono già presenti ci devi convivere.

Se la prima lettera del nome è comunque salvata in maiuscolo potresti mettere nel codice di controllare la prima lettera, se è minuscola la rende maiuscola altrimenti non fa niente.

Alternativa (migliore), verifica se nel mysql non esista la possibilità di passare un “ignorecase”, cioè qualche cosa di simile a:

$query = WHERE `titolo` LIKE 'ignorecase(".$titolo.");

La tua idea sarebbe buona.

Purtroppo parlando di titolo la cosa non funziona:

se io cerco age minuscolo NON trova tutti quelli il cui titolo inizia per Age (ovviamente maiuscolo essendo la prima parola) quindi mi ritrovo con:

cerco age --> Middle age --> lo trova
–> Age of sword --> NON lo trova

Il che per un opac è inaccettabile purtroppo.

Il bello è che con il mysql 3.23.39 funzionava.

Enrico

sì, è vero.
Guarda se esiste per il DB che usi una funzione di IGNORECASE, visto che in genere per i linguaggi di programmazione c’è: in pratica controlla una stringa fregandosene se sia maiuscolo o minuscolo.

Oppure in ultima soluzione prova su una piccola collezione di dati a trasformare tutte le parole in maiuscolo (funzioni tipo TOUPPERCASE) e poi quando l’utente fa l’interrogazione passi una stringa “preparata” tutta in maiuscolo, così dovrebbe funzionare.