Problema UTF-8 mysql | SQL & MySQL

Topic: Pubblico - Composto da 10 Posts di 2 Utenti.

01 Ottobre, 2011 06:52 #1
artasdog
Utente

artasdog
Registrato: Oct, 2011
Posts: 7
Offline

Un saluto a chi frequenta il forum, è il mio primo post qui.
Il mio problema è il seguente:
Ho un sito con impostato charset UTF-8 , il database mysql è impostato a utf8-general-ci . Quando salvo del testo proveniente dal sito sono costretto ad utilizzare un metodo un po' artificioso per evitare problemi con i caratteri accentati.
Il metodo che utilizzo e che vorrei evitare di utilizzare se riuscissi ad impostare il database nella maniera corretta è convertire il testo proveniente dal sito tramite la funzione php utf8_decode prima di salvarlo, ovvero trasformo il charset della stringa da utf8 a iso-8859-1.
Prima di andare in output devo tornare ad utf-8 tramite utf8_encode.
Sono sicuro che così facendo sto mettendo una pezza al problema ma non lo sto risolvendo e mi piacerebbe con il vostro aiuto capire quali impostazioni del database cambiare.
Grazie per le eventuali risposte.

Ultima modifica 01 Ottobre, 2011 06:55 di artasdog


Per fare una domanda velocemente dovete andare su Questioner

01 Ottobre, 2011 09:46 #2
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

utf8-general-ci è una collation, ovvero una serie di regole che dicono a MySQL come ordinare alfabeticamente un testo UTF8.
Per vedere se il problema è davvero in MySQL, dacci il risultato di questa query:

1SHOW VARIABLES LIKE 'character_set_%';

01 Ottobre, 2011 15:25 #3
artasdog
Utente

artasdog
Registrato: Oct, 2011
Posts: 7
Offline

Questo è il risultato della query nel database specifico del sito:

Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/


Per fare una domanda velocemente dovete andare su Questioner

02 Ottobre, 2011 00:03 #4
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Allora il problema non è in MySQL, sono i dati che gli invii a non essere UTF8
Dove/come li prendi?

02 Ottobre, 2011 04:43 #5
artasdog
Utente

artasdog
Registrato: Oct, 2011
Posts: 7
Offline

Da qualsiasi text input o textarea del sito, impostato con charset utf-8. si presenta il problema nel salvataggio dei caratteri che non fanno parte del set iniziale da 128 caratteri. Ripeto nella pratica le accentate. Se servono altri dettagli relativi ad altre caratteristiche del documento o del database chiedi pure che li posto.
I dati prima di essere inseriti nel database vengono solamente verificati con espressioni regolari e addslashes per evitare injection.

Aggiungo un dettaglio che può darti altre informazioni utili.
Attualmente per risolvere la funzione php utf8_decode per convertire gli input la utilizzo con tutti i browser meno che con internet explorer, infatti con ie i dati vengono inseriti correttamente, mentre con opera,ff,safari,chrome la devo utilizzare. Per distinguere quando usarla utilizzo una espressione regolare.


Per fare una domanda velocemente dovete andare su Questioner

02 Ottobre, 2011 04:44 #6
artasdog
Utente

artasdog
Registrato: Oct, 2011
Posts: 7
Offline

Un altra cosa, quindi il database puoi confermare che è impostato correttamente utf8 e che il: character_set_server latin1 non è un problema?
Le tabelle le ho create senza specificare mai il charset in questa maniera:
CREATE TABLE author (

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(255),

email VARCHAR(255)

);
ed il database lo ho create con un tool che non mi ha mai chiesto il charset.

Ultima modifica 02 Ottobre, 2011 06:22 di artasdog


Per fare una domanda velocemente dovete andare su Questioner

02 Ottobre, 2011 08:39 #7
artasdog
Utente

artasdog
Registrato: Oct, 2011
Posts: 7
Offline

Ok ho capito meglio la situazione:

Il documento è in UTF8

Prima di salvare un input lo converto con UTF8_DECODE ( cioè UTF8 -> LATIN1 )

Verificando come è impostato il character set della connessione di mysql tramite la funzione mysql_client_encoding risulta LATIN1

Quindi quando salvo nel database il mio dato che ho appena fatto diventare LATIN1 tramite UTF8_DECODE, ora viene considerato LATIN1 in partenza quindi viene trasformato da LATIN1 a UTF8

Quindi il mio input fa questi passaggi:
1:utf8(documento)
2:(utf8->latin1) "tramite utf8_decode"
3:(latin1->utf8) "a causa della connessione impost. a latin1"
4:utf8(database)

Ora devo togliere UTF8_DECODE ed impostare la connessione in utf8 per evitare i due passaggi in più inutili.

Ultima modifica 02 Ottobre, 2011 08:40 di artasdog


Per fare una domanda velocemente dovete andare su Questioner

02 Ottobre, 2011 09:44 #8
artasdog
Utente

artasdog
Registrato: Oct, 2011
Posts: 7
Offline

Ok la soluzione finale è stata l'utilizzo della funzione:
mysql_set_charset
per settare la connessione al database a utf8


Per fare una domanda velocemente dovete andare su Questioner

02 Ottobre, 2011 12:57 #9
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Scusami!! Nella fretta mi è sfuggito: certo, character_set_server deve essere utf8! Però non sono sicuro che il problema sia questo.
Per le tabelle, non è un problema: se non specifichi il charset viene usato quello di default del database. Ovviamente, accertati sempre che il programma che usi non imposti un charset diverso da utf8 alle tabelle o alle singole colonne.
Fammi sapere se cambiando character_set_server il problema si risolve...

03 Ottobre, 2011 11:39 #10
artasdog
Utente

artasdog
Registrato: Oct, 2011
Posts: 7
Offline

si si è risolto, come scritto sopra il charset della connessione predefinito prima( rilevato con mysql_client_encoding ) era LATIN1 e con mysql_set_charset è stato cambiato.
Il problema con windows invece è stato risolto impostando il charset anche nel .htaccess, perchè si vede che ie8 in alcune condizioni non prende in considerazione il charset impostato nell'header della pagina.
Un operazione in teoria semplice si è trasformata in un bel casino comunque :)


Per fare una domanda velocemente dovete andare su Questioner

Condividi su:

Loggati o Registrati per replicare