Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49

    maledetti caratteri accentati !

    Buongiorno,

    Ho creato un database in mysql con frontend in java, il problema è che se inserisco un carattere accentato tipo "è" mi ritorna il classico punto interrogativo.
    ho fatto alcune prove....nella jtextarea al momento dell'immissione viene visualizzato correttamente....così come nella console...e così anche nel database....solo quando richiamo per visualizzare il tutto mi ritorna il carattere sbagliato, sia java che mysql sono dettati per utf-8...di seguito alcuni screenshot:

    Scrive correttamente a video:
    Schermata 2016-09-30 alle 13.57.17.png

    Richiamandolo...si vede il ?:
    2.jpg

    se ispeziono il contenuto con workbench....si vede che in mysql è memorizzato correttamente....quindi è un problema di quando richiedo i dati.

    il codice è questo:
    codice:
     public class MysqlStuff {	 
    	 static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    	 
    	 static final String DB_URL ="jdbc:mysql://localhost/";
    	 static final String db= "LessonLearned";
             static final String u ="xxxxx";
             static final String p= "xxxxx";
    	 static Connection UP=null;
    	 public static Connection connetti() 
    	 throws ClassNotFoundException, SQLException{
    		 System.out.println("mi connetto...");
    		 UP = null;
    		 Class.forName(JDBC_DRIVER);
    		 //punto 3 ottenere connessione
    		 UP = DriverManager.getConnection(DB_URL+db,u,p);
    		 return UP;
    	 }
    codice:
    public  static void inviaDatiSQL(String sql,String stat) throws SQLException, ClassNotFoundException{                 UP = connetti();
    		 System.out.println("INVIO dati a DB: \n"+ sql);
    		 Statement stmt = null;
    		 
                     PreparedStatement test = UP.prepareStatement(sql);
                     test.setString(1, stat);
                     
    		 test.executeUpdate();
    		 System.out.println("Finito !");
    	 }
    codice:
     public  static ResultSet richiediDatiSQL (String sql) throws SQLException, ClassNotFoundException{                 UP = connetti();
    		 System.out.println("RICHIEDO dati a DB: \n\n"+ sql);
    		 Statement stmt = null;
    		 ResultSet res = null;
    		 stmt = UP.createStatement();
    		 res = stmt.executeQuery(sql);
                     
    		 return res;
    		 
    	 }
    Immagini allegate Immagini allegate

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto chiarisci quale è l'encoding usato per quella tabella/colonne. Questo lo puoi vedere da un sw di amministrazione del database MySQL oppure con delle query apposite.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto chiarisci quale è l'encoding usato per quella tabella/colonne. Questo lo puoi vedere da un sw di amministrazione del database MySQL oppure con delle query apposite.
    Sia il database che le tabelle sono in utf-8, avevo pensato anche io a questa cosa ed infatti di default mysql le crea in latin-1, ma avevo provveduto.

    Alex

    mysql2.jpg

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    Aggiornamento:

    provando e riprovando ho sostituito temporaneamente una JtextArea con una JtextField....è tutto ok con essa.
    Quindi deduco che il problema sia proprio sul componente.

    Ogni aiuto è ben accetto !

    Alex

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da magobin Visualizza il messaggio
    provando e riprovando ho sostituito temporaneamente una JtextArea con una JtextField....è tutto ok con essa.
    Quindi deduco che il problema sia proprio sul componente.
    Non credo .... perlomeno mi sembrerebbe molto strano (però bisognerebbe vedere come hai usato JTextArea). Le problematiche sui charset in generale sono un po' spinose e possono capitare anche per via di errori "subdoli" e magari a più livelli.

    Visto che il programma è tuo ... debuggalo! Cioè verifica cosa contengono le stringhe. La "è" per essere corretta nella stringa Java DEVE essere un char di codice 232 (0x00E8 cioè esadecimale). Quel simbolo con ? che hai mostrato come è codificato nella stringa Java? Già da questo si potrebbe forse capire cosa è successo.

    Inoltre, prova a leggere qui: 5.4 Using Character Sets and Unicode
    è la documentazione ufficiale del Connector/J che spiega in generale l'uso dei charset.

    Prova anche a fare "a mano" una SELECT sul quel campo usando la funzione ORD() di MySQL che ti fornisce il codice del primo carattere della stringa. Fai chiaramente in modo che il carattere incriminato sia appunto il primo.
    Ultima modifica di andbin; 01-10-2016 a 11:07
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Inoltre, prova a leggere qui: 5.4 Using Character Sets and Unicode
    è la documentazione ufficiale del Connector/J che spiega in generale l'uso dei charset.

    Prova anche a fare "a mano" una SELECT sul quel campo usando la funzione ORD() di MySQL che ti fornisce il codice del primo carattere della stringa. Fai chiaramente in modo che il carattere incriminato sia appunto il primo.
    Allora....sto debuggando il programma....ho capito che il problema è nella tipologia di dati della colonna che ospita il dato e cioè BLOB. Ho cercato di ovviare inserendo questa modifica:

    codice:
    byte[] domande = res.getString("Domanda").getBytes();
                           String s = new String( domande, "UTF-8");
    dato che la table ha come encoding UTF8-Default collation

    Mysql non lo conosco benissimo...comunque ora provo a fare un SELECT sul campo come dici tu

    Intanto grazie
    Alex
    Ultima modifica di magobin; 01-10-2016 a 15:24 Motivo: errori di ortografia

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    Aggiorno dicendo che ho fatto un ORD sul campo BLOB che ospita la mia "�" e il codice � effettivamente il 232

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    anche HTML.it non mi riconosce la mia "è" \232

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da magobin Visualizza il messaggio
    il problema è nella tipologia di dati della colonna che ospita il dato e cioè BLOB.
    Ahhh dovevi dirlo prima che è un BLOB ! il BLOB contiene un flusso "crudo" di byte. Il DB non "sa" nulla di che cosa rappresenta o contiene quella colonna. Se per te contiene del "testo" allora spetta a TE effettuare le conversioni da String a byte[] e viceversa in maniera fissa, uniforme e coerente.

    Quote Originariamente inviata da magobin Visualizza il messaggio
    codice:
    byte[] domande = res.getString("Domanda").getBytes();
    No! getBytes() di String (quello così, senza argomenti) usa il charset di default della piattaforma su cui sta girando la applicazione Java. Quindi NON va bene.

    Usa sempre UTF-8 per queste conversioni.

    Quote Originariamente inviata da magobin Visualizza il messaggio
    dato che la table ha come encoding UTF8-Default collation
    Non ha nulla che fare con i BLOB. I BLOB non hanno un "encoding" di per sé. Quello che contengono lo devi sapere tu e trattare in modo adeguato, non lo sa il DB.

    Quote Originariamente inviata da magobin Visualizza il messaggio
    Mysql non lo conosco benissimo...comunque ora provo a fare un SELECT sul campo come dici tu
    Non serve più di tanto, ora che sappiamo che è un BLOB. Il problema è sicuramente dovuto a tue conversioni inappropriate.

    P.S.: e tra l'altro, se è un BLOB, allora non dovresti usare setString di PreparedStatement né getString del ResultSet.
    P.S. 2: se è solo testo (potenzialmente molto lungo), perché non un CLOB (Character Large OBject)? Che in MySQL si chiamano tecnicamente TINYTEXT, TEXT, ecc....
    Ultima modifica di andbin; 01-10-2016 a 16:15
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    49
    HO risolto....avevo gi� provato ad usare come container LONGTEXT ma, come detto, non conosco molto bene Mysql, quindi cambiavo la tipologia della colonna ma non la collation...ho riprovato ora ad usare LongText cambiando la collection e funziona il tutto.

    Grazie ancora per l'input !!!

    Alex

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.