Problema di scrittura delle stringhe JDBC MySQL UTF-8

Connetti a db:

public DBSource(ConnectionInfo ci) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException { Class.forName("com.mysql.jdbc.Driver").newInstance(); String dbPath = String.format( "jdbc:mysql://%s:%d/%s?user=%s&password=%s&characterEncoding=utf-8&" + "useUnicode=true", ci.host, ci.port, ci.dbName, ci.user, ci.password); conn = java.sql.DriverManager.getConnection(dbPath); prepareTables(); } 

Codice di creazione tabella:

 private void prepareTables() throws SQLException { java.sql.Statement stat = conn.createStatement(); String query = "set names utf8"; stat.execute(query); query = "set character set utf8"; stat.execute(query); query = "show variables like '%char%'"; stat.execute(query); java.sql.ResultSet rs = stat.getResultSet(); while (rs.next()) { String k = rs.getString(1); String v = rs.getString(2); System.out.println(k + " - " + v); } query = "drop table if exists clt"; stat.execute(query); query = "create table clt" + "(" + " id bigint not null" + ", text varchar(50) not null" + ") default character set utf8"; stat.execute(query); } 

inserimento delle righe:

 public void visit(Insert i) throws SQLException { String query = "insert into clt" + " (id, text) values (?, ?)"; java.sql.PreparedStatement stmt = conn.prepareStatement(query); if (i.rowData.id == 12656697) { String toOut = "<<< " + Long.toString(i.rowData.id) + " - " + i.rowData.text; System.out.println(toOut); } int it = 0; stmt.setLong(++it, i.rowData.id); stmt.setString(++it, i.rowData.text); stmt.execute(); stmt.close(); } 

controllare i dati:

  public void checkText() throws SQLException { java.sql.Statement stmt = conn.createStatement(); String query = "select id, text from clt where id = '12656697'"; stmt.execute(query); java.sql.ResultSet rs = stmt.getResultSet(); while (rs.next()) { String k = rs.getString(1); String v = rs.getString(2); String toOut = ">>> " + k + " - " + v; System.out.println(toOut); } } 

produzione:

 character_set_client - utf8 character_set_connection - latin1 character_set_database - latin1 character_set_filesystem - binary character_set_results - utf8 character_set_server - utf8 character_set_system - utf8 character_sets_dir - /usr/share/mysql/charsets/ <<>> 12656697 - ??????? 

Problema : nella tabella ho i simboli ” ??????????? ” nel campo di testo.

la stringa prevista è : Апарати
risultato : ???????

È una specie di magia
Ho risolto un problema … ma apprezzerò comunque se lo smbd me lo spiegherà.
Così.

  1. Ho aggiunto alle mie linee /etc/mysql/my.cnf suggerite da Costis Aivalis
    risultato lo stesso
  2. Ho rimosso le righe dal mio codice:
    query = “imposta set di caratteri utf8”;
    stat.execute (query);

funziona!!! 🙂

Assicurati che la codifica di configurazione MySQL sia definita correttamente. Controlla le tue impostazioni e la correttezza delle modifiche con questi comandi:

 show variables like 'character%'; 

e show variables like 'collation%';

Aggiungi queste linee a my.cnf o my.ini :

Per MySQL 5.1.nn e versioni successive 5.5.29 hai solo bisogno di queste due linee:

 [mysqld] character-set-server = utf8 character-set-filesystem = utf8 

Per MySQL 5.0.nn e versioni precedenti utilizzare queste impostazioni:

 [client] default-character-set=utf8 

 [mysql] default-character-set=utf8 

 [mysqld] default-character-set=utf8 character-set-server=utf8 

Probabilmente è più comodo usare MySQL-Workbench per le tue impostazioni. Le versioni 5+ sono eccellenti.

inserisci la descrizione dell'immagine qui

Nel tuo programma Java connetti in questo modo:

 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase?useUnicode=true&characterEncoding=UTF-8","user","passwd"); 

Se ottieni ????????? aggiungi il parametro characterEncoding=utf-8 invece di useUnicode=true . Guarda i seguenti esempi.

Per il testo inglese:

 String url = "jdbc:mysql://localhost:" + port + "/DBName?useUnicode=true&..."; 

Per il testo in lingua russa:

 String url = "jdbc:mysql://localhost:" + port + "/DBName&characterEncoding=utf-8&...";