Gen 28 2006
Soluzione problemi codifica caratteri in MySQL/PHP
Buongiorno a tutti,
innanzitutto cominciamo ad inquadrare il problema e a fare presente che se ora sono in grado di scrivere questo articolo è grazie al supporto che ho ricevuto sul forum di HTML.IT da parte di Leandro Luccerini, per contatti: leandro980[AT]libero[DOT]it
PREMESSE AL PROBLEMA
DESCRIZIONE PROBLEMA
La situazione problematica nasce nel momento in cui abbiamo un sito web che deve gestire caratteri extra latini, per esempio nel mio caso ho affrontato questo problema dovendo realizzare un sito in lingua russa, ovvero utilizzando il cirillico.
Il mio approccio alla situazione e’ stato quello di realizzare TUTTE le pagine web con codifica utf8 e database, tabelle e campi di testo utf8 a loro volta.
La cosa che mi ha fatto impazzire e capirci veramente poco per diverso tempo e’ che se io inserivo nel database caratteri cirillici come ad esempio (ßрøòõт - ciao) e da PhpMyADMIN (di seguito PMA) vedevo male, idem il dump, mentre quando tiravo su i dati da applicativo tutto funzionava a meraviglia.
Capitava l’inverso con PMA, ovvero se inserivo in cirillico su PMA e visualizzavo da PMA tutto bene, via applicazione niente.
SOLUZIONE
Prima di tutto vi invito a leggervi questa parte di manualistica online di mysql, CHARSET.
Sostanzialmente sui server mysql di sistemi di hosting italiani (ma credo anche americani) e comunque in generale, l’impostazione del default_character_set è impostata a latin1.
Ma anche qualora sia impostata ad utf8 quando via script php ci connettiamo al database mysql la nostra sessione di default (nonostante la pagina sia encodata utf8) sarà attivata con character set latin1, cosa succede quindi, che i dati e le query che inviamo sfasano e il sistema memorizza erroneamente i dati.
Di fatto il comportamento giusto lo ha PMA, dobbiamo cercare quindi di emularlo.
Per farlo basta di fatto lanciare dopo ogni connessione la seguente query: SET NAMES utf8
Così facendo la connessione tra client e server sarà UTF8.
CONCLUSIONE
Per concludere possiamo dire che per siti che trattano lingua standard europee come italiano, inglese, francese etc… possiamo avere tutto il DB latin1, connessione client server latin1 ed encoding ISO-8859-1
Nel caso di siti con cirillico, arabo etc… utilizziamo tutto il database UTF8, encoding delle pagine UTF8 e soprattutto dobbiamo eseguire per sicurezza la query sopra indicata dopo ogni connessione con mysql.
Mi scuso per non essere stato molto chiaro in alcuni punti, purtroppo questo argomento è complesso e fastidioso…
Se avete suggerimenti sono benvenuti.
Ciao a tutti. Max
info[AT]massimo-caselli[DOT]com
Ciao,
ho avuto lo stesso problema, anzi simile ma con soluzione uguale, quando ho dovuto trasferire dei db da mysql a Oracle, imbattendomi con i problemi di charset in apache, php, mysql e Oracle infine. Tutto nasce dalla “leggerezza” con cui vengono affrontate le cose, talvolta…
Ciao Skop,
hai ragione, a volte vengono affrontati con leggerenza sia dagi sviluppatori ma anche dai produttori stessi.
mysql 4.1 e’ stato un pozzo di scoperte e anche di trabocchetti…
Saluti, Max
Io invece ho un problema su un altro aspetto, che voi sembra abbiate risolto.
Non riesco a visualizzare la pagina php in cirillico (in realta’ nemmeno quella html…).
Il browser non “comprende” la giusta codifica leggendola dal meta che ho messo:
Come avete fatto? Come forzate il browser, quando legge una vostra pagina, a visualizzarla con la codifica che gli indicate, in modo da visualizzare bene il cirillico???
Grazie
Ciao Giulio,
penso che il problema risieda nel fatto che apache possa forzare una codifica sbagliata.
Il VirtualHost deve avere per sicurezza AddDefaultCharset Off
Ciao. Max
Grazie Max.
Vedro’ di far applicare la modifica al sistemista del server.
Max, sei un grande!!!!
Funziona!!
E basta mettere il comando che mi hai indicato in un .htaccess.
Ci stavo diventando scemo!! GRAZIE!!!
Grazie Giulio!
Sono contento che hai risolto!
Ciao. Max
Ciao Max,
grazie per la citazione
E cmq è vero che mysql è pieno di trabocchetti. Provate a fare un upgrade da una versione che non supporta le codifiche delle singole colonne ecc. ecc. state tranquilli che qualche casino di mancata corrispondenza di codifica viene fuori! A presto
Grazie a te Leandro!
Ciao. Max
P.S. sono d’accordissimo con te sulle insidie degli update di mysql…
Io sto impazzendo con una pagina dinamica che ogni tanto mostra i punti interrogativi al posto di alcuni caratteri cirillici.
Il db mysql ha i campi varchar in UTF-8, la pagina è impostata e sulle query faccio SET NAMES utf8.
La cosa strana è che facendo aggiorna col browser la pagina si mette a posto o si scombina… Ancora più strano è che non tutte le scritte cirilliche vengono sostituite dai punti interrogativi ma solo alcune…
io ti vorrei ringraziare:
il tuo tutorial mi è stato davvero d’aiuto per risolvere x la versione in russo di un sito
Con ritardo ti rispondo Marco… sono contento che l’articolo ti sia servito.
Tra l’altro migrando da hosting ad hosting ho avuto dei problemi anche io con i salti di versione.
Alcuni caratteri scazzano soprattutto negli articoli più vecchi…
Ciao. Max
Ciao Max,
quando si trovano informazioni così utili descritte con tale chiarezza è un dovere ringraziare.
Grazie mille Fabio, è stato un piacere pubblicare questo articolo perché dietro a questa cosa ci sono veramente diventato scemo…
Ciao. Max
Grazie Max
Il tuo articolo mi è stato di grande aiuto, stavo impazzendo sulla questione.
Ciao Giuseppe,
sono davvero contento ti sia piaciuto e di utilità.
Ora lo pubblico su una pagina apposta per gli articoli più interessanti.
Ciao. Max