Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    Mysql differenze tra caratteri accentati

    Salve a tutti.
    Se faccio una query tipo
    select * from tabella where 'pippo'like 'pippò'
    mi aspetterei di avere una condizione falsa, in quanto pippo è diverso da pippò. Invece mi restituisce tutti i record proprio come se avessi scritto

    select * from tabella where 1=1
    1) perchè mysql vede 'o' e 'ò' come se fossero uguali?
    2) c'è modo di discriminare la differenza con qualche operatore diverso da = o da like?

    Molte grazie.

  2. #2

  3. #3
    Utente di HTML.it L'avatar di skjobax
    Registrato dal
    Jan 2010
    Messaggi
    569
    Semplicemente perché SQL non fa distinzione tra lettere accentate e causa questi problemi.
    Io l'ho risolto codificando in UTF-8 la stringa con htmlentities():

    Codice PHP:
    <?php
    //...
    $var htmlentities("ò"); //Per maggiori informazioni visita: [url]http://php.net/manual/en/function.htmlentities.php[/url]
    $sql mysql_query("INSERT INTO database.tabella (campi) VALUES (".$var.")");
    //...
    ?>

    SQL:

    SELECT * FROM database.tabella WHERE campi LIKE "parola con la o";

    O, se preferisci:

    SELECT * FROM database.tabella WHERE campi = "parola con la o";
    E funziona.
    Questo perché htmlentities trasforma la lettera accentata nel corrispondente UTF-8.
    In pratica, ha trasformato "ò" in "&amp;ograve;".
    Per decodificare il valore senza la str_replace o str_ireplace, utilizza html_entity_decode($stringa_utf8), che sta alla pagina http://www.php.net/manual/en/functio...ity-decode.php.
    Oppure prova con htmlspecialchars() alla pagina http://www.php.net/manual/en/functio...ecialchars.php.

  4. #4
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Originariamente inviato da skjobax
    Semplicemente perché SQL non fa distinzione tra lettere accentate e causa questi problemi.

    Consiglio anche a te una bella lettura ai link che ho postato sopra.

  5. #5
    Utente di HTML.it L'avatar di skjobax
    Registrato dal
    Jan 2010
    Messaggi
    569
    Intanto a me funziona e ho sempre risolto il problema in questo modo, bello.
    E comunque i siti ufficiali php.net, etc. li ho sempre letti, sempre informato.
    E se faccio qualche errore... sarà perché ho ancora 12 anni e ne compio 13 il 22 marzo!!

  6. #6
    Originariamente inviato da skjobax
    Intanto a me funziona e ho sempre risolto il problema in questo modo, bello.
    E comunque i siti ufficiali php.net, etc. li ho sempre letti, sempre informato.
    E se faccio qualche errore... sarà perché ho ancora 12 anni e ne compio 13 il 22 marzo!!
    Sono felice per te, bello, ma qui siamo abituati a dare soluzioni VERE non ad AGGIRARE i problemi perché c'è gente che ci lavora con queste cose ... bello

    Detto questo, @spettinato non usare htmlentities o simili e relative inverse e via dicendo perché devi inserire i dati nel database correttamente, non ricodificando i dati (inutilmente).

    Per prima cosa ti devi assicurare che la collation delle tabelle/database sia, ad esempio, utf8_general_ci (che sta per codifica UTF8, Generica e Case Insensitive, ovvero che non da peso alla differenza tra maiuscoli e/o minuscoli nei confronti), poi ti devi assicurare che la connessione verso il database stia usando come codifica UTF8, e lo si fa tramite delle query, subito dopo la connessione (dai un occhio qua http://dev.mysql.com/doc/refman/5.1/...onnection.html ), ovvero usando SET NAMES 'utf8'.
    Per finire devi comunicare con il tuo browser in utf8 cosi da essere sicuro che lui ti invii i dati codificati correttamente cosi da poterli controllare e caricare sul database senza bisogno di effettuare particolari modifiche (dato che le versione attualmente presenti di PHP non supportano correttamente le codifiche dei caratteri multi-byte)
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #7
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Originariamente inviato da daniele_dll
    Per prima cosa ti devi assicurare che la collation delle tabelle/database sia, ad esempio, utf8_general_ci
    Veramente a lui serve latin1_general_ci. nella collation utf8_general_ci le accentate hanno lo stesso encoding delle "normali"

    tra l'altro, si dovrebbe poter fare tutto al volo, qualcosa tipo
    codice:
    select * from tabella where _latin1 'pippo' collate latin1_general_ci = 'pippò';
    che dovrebbe dare 0 risultati mentre
    codice:
    select * from tabella where _utf8 'pippo' collate utf8_general_ci = 'pippò';
    dovrebbe restituire tutte le righe

    ma ovviamente e' meglio predisporre tutto prima, le collate al volo sono per casi problematici

  8. #8
    Utente di HTML.it L'avatar di skjobax
    Registrato dal
    Jan 2010
    Messaggi
    569
    Ehi, guarda che io ho solo 12 anni, bello, e se uso quelli è perché:

    1)&Egrave; il metodo che più mi conviene.
    2)Su php.net ho trovato questo metodo.
    3)Funziona ed è aggiornato, bello.

    Ho fatto un sito internet (anche se con l'aiuto del CMS wordpress) che parla di software IT (informartici - purtroppo ora il sito è fermo perché sono impegnato nel creare un social network tipo facebook, lo chiamerò ClubSociety) ed è: xyz
    Mi sono registrato come skjobax perché diceva che ray97 era già stato preso da un altro.
    E comunque funziona.

  9. #9
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Originariamente inviato da skjobax
    [...]
    Siamo ovviamente tutti felici per la tua precocita', e per la capacita' di trovare workaround inutili. E non lo mettiamo in dubbio che funzioni.
    Quello che daniele cercava di spiegarti, e il fatto che qui si cerca di dare alle persone la soluzione corretta.

    La soluzione che hai proposto "funziona", ma solo in un caso: quando si cerca un valore (e sorvoliamo sui discorsi ottimizzazione/spazio/risorse).
    Metti che invece si debbano fare anche altre operazioni, come un ordinamento su quel campo? Su un database progettato correttamente, la "ò" sara' subito dopo la "o". Su un database con i tuoi trucchetti, la "& ograve;" sara' prima della "a".

  10. #10
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da skjobax
    Io l'ho risolto codificando in UTF-8 la stringa con htmlentities():
    Avere 12 anni è un ottimo motivo per tenere la testa bassa e cercare di imparare, non per scrivere idiozie come questa.
    Abbassa la cresta va'

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.