Articoli, news e pillole sul mondo LAMP e l'opensource. Pillole di C#
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
| Stampa l'articolo | Questo articolo è stato pubblicato da maxgrante il 28 January 2006 alle 21:19, ed è archiviato come MySQL, DB Server, PHP il turbo nel web. Puoi seguire i commenti a questo post attraverso RSS 2.0. Puoi pubblicare un commento o segnalare un trackback dal tuo sito. |
circa 4 anni fa
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…
circa 4 anni fa
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
circa 4 anni fa
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
circa 4 anni fa
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
circa 4 anni fa
Grazie Max.
Vedro’ di far applicare la modifica al sistemista del server.
circa 4 anni fa
Max, sei un grande!!!!
Funziona!!
E basta mettere il comando che mi hai indicato in un .htaccess.
Ci stavo diventando scemo!! GRAZIE!!!
circa 4 anni fa
Grazie Giulio!
Sono contento che hai risolto!
Ciao. Max
circa 4 anni fa
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
circa 4 anni fa
Grazie a te Leandro!
Ciao. Max
P.S. sono d’accordissimo con te sulle insidie degli update di mysql…
circa 3 anni fa
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…
circa 3 anni fa
io ti vorrei ringraziare:
il tuo tutorial mi è stato davvero d’aiuto per risolvere x la versione in russo di un sito
circa 3 anni fa
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
circa 2 anni fa
Ciao Max,
quando si trovano informazioni così utili descritte con tale chiarezza è un dovere ringraziare.
circa 2 anni fa
Grazie mille Fabio, è stato un piacere pubblicare questo articolo perché dietro a questa cosa ci sono veramente diventato scemo…
Ciao. Max
circa 2 anni fa
Grazie Max
Il tuo articolo mi è stato di grande aiuto, stavo impazzendo sulla questione.
circa 2 anni fa
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
circa 1 anno fa
Per completezza, ho provato ad aggiungere anche la “collation”
SET NAMES utf8 COLLATE utf8_general_ci
Credo che
SET NAMES utf8
imposti automaticamente ‘utf8_general_ci’ in quanto default collation (dipendentemente da parametri di configurazione del server??? Probabilmente si.)
Oltre all’informazione del charset, iniettare anche l’informazione sulla collazione in un eventuale classe
$_db['AnagrafeInternazionale']['TURKISH'] = new MioFramework_Mysql_Db(array(
‘host’ => ‘xxx.yyy.zzz.kkk’,
‘user’ => ‘unUtente’,
‘pass’ => ‘unaPassword’,
‘name’ => ‘unDatabase’,
‘port’ => ’3307′,
‘charset’ => ‘latin5′,
‘collation’ => ‘latin5_turkish_ci’
));
credo vada a completare la flessibilità della soluzione
circa 1 giorno fa
grazie anche da parte mia. hai aiutato anche me