Gen 28 2006

Soluzione problemi codifica caratteri in MySQL/PHP

Published by maxgrante at 21:19 under MySQL, DB Server, PHP il turbo nel web

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

  • mysql versione > 4.1.x
  • Tipo di encoding delle pagine web php utf8

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

16 Responses to “Soluzione problemi codifica caratteri in MySQL/PHP”

  1. Skopon 30 Gen 2006 at 09:41

    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… :-)

  2. maxgranteon 30 Gen 2006 at 12:19

    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… :-D

    Saluti, Max

  3. Giulioon 16 Mar 2006 at 18:56

    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

  4. maxgranteon 16 Mar 2006 at 21:40

    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

  5. Giulioon 21 Mar 2006 at 02:19

    Grazie Max.
    Vedro’ di far applicare la modifica al sistemista del server.

  6. Giulioon 21 Mar 2006 at 02:31

    Max, sei un grande!!!!
    Funziona!!
    E basta mettere il comando che mi hai indicato in un .htaccess.
    Ci stavo diventando scemo!! GRAZIE!!!

  7. maxgranteon 21 Mar 2006 at 07:37

    Grazie Giulio!

    Sono contento che hai risolto!

    Ciao. Max

  8. Leandro Luccerinion 12 Apr 2006 at 11:00

    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

  9. maxgranteon 12 Apr 2006 at 11:22

    Grazie a te Leandro!

    Ciao. Max
    P.S. sono d’accordissimo con te sulle insidie degli update di mysql;)

  10. Fabioon 27 Apr 2007 at 16:27

    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…

  11. Marcoon 04 Mag 2007 at 01:02

    io ti vorrei ringraziare:
    il tuo tutorial mi è stato davvero d’aiuto per risolvere x la versione in russo di un sito

  12. maxgranteon 17 Ago 2007 at 00:56

    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

  13. Fabioon 04 Feb 2008 at 17:37

    Ciao Max,
    quando si trovano informazioni così utili descritte con tale chiarezza è un dovere ringraziare.

  14. maxgranteon 05 Feb 2008 at 10:08

    Grazie mille Fabio, è stato un piacere pubblicare questo articolo perché dietro a questa cosa ci sono veramente diventato scemo… :-D

    Ciao. Max

  15. Giuseppeon 18 Apr 2008 at 16:03

    Grazie Max

    Il tuo articolo mi è stato di grande aiuto, stavo impazzendo sulla questione.

  16. maxgranteon 18 Apr 2008 at 16:06

    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

Trackback URI | Comments RSS

Leave a Reply