2016-08-02 15 views
0

Dies ist mein derzeitiger Zeichensatz. Ich versuche, latin1 Zeichen einzufügen, und ich kann es nicht zum Funktionieren bringen.mysql jdbc-Treiber erkennt latin1-Zeichen nicht

SHOW VARIABLES LIKE 'char%'; 
+--------------------------+-----------------------------------+ 
| Variable_name   | Value        | 
+--------------------------+-----------------------------------+ 
| character_set_client  | latin1       | 
| character_set_connection | latin1       | 
| character_set_database | utf8        | 
| character_set_filesystem | binary       | 
| character_set_results | latin1       | 
| character_set_server  | latin1       | 
| character_set_system  | utf8        | 
| character_sets_dir  | /space/xyz/mysql/share/charsets/ | 
+--------------------------+-----------------------------------+ 

Die Datenbankkonfiguration wird nicht von mir erstellt, daher kann ich den Zeichensatz nicht ändern oder sortieren.

show create table t1; 
+-------+-------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                           | 
+-------+-------------------------------------------------------------------------------------------------------------------------+ 
| t1 | CREATE TABLE `t1` (
    `col1` text CHARACTER SET latin1 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs | 
+-------+-------------------------------------------------------------------------------------------------------------------------+ 

Hier ist der einfache Code zum Einfügen eines Namens mit Unicode-Zeichen.

private void insert() { 
     try { 
      loadJdbcProperties(); 
      String myquery = "INSERT INTO db.t1(col1) VALUES (?)"; 
      String url = "jdbc:mysql://localhost:3307/db?useUnicode=true&characterEncoding=Cp1252"; 
      Properties prop = new Properties(); 
      prop.put("user", "root"); 
      prop.put("password", "root"); 
      if (_jdbcProperties != null && !_jdbcProperties.isEmpty()) { 
       prop.putAll(_jdbcProperties); 
      } 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      Connection c = DriverManager.getConnection(url, prop); 

      PreparedStatement pstmt = null; 
      String sql = null; 

      sql = myquery; 
      pstmt = c.prepareStatement(sql); 
      pstmt.setString(1, "csvźà.py"); 
      pstmt.execute(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Dies ist der Code für den Abruf. Hier

private void showResults() { 
     try { 
      loadJdbcProperties(); 
      String myquery = "select col1 from db.t1"; 
      String url = "jdbc:mysql://localhost:3307/db?useUnicode=true&characterEncoding=Cp1252"; 

      Properties prop = new Properties(); 
      prop.put("user", "root"); 
      prop.put("password", "root"); 
      if (_jdbcProperties != null && !_jdbcProperties.isEmpty()) { 
       prop.putAll(_jdbcProperties); 
      } 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      Connection c = DriverManager.getConnection(url, prop); 

      PreparedStatement pstmt = null; 
      String sql = null; 
      ResultSet rs = null; 

      sql = myquery; 
      pstmt = c.prepareStatement(sql); 
      rs = pstmt.executeQuery(); 
      while (rs.next()) { 
       System.out.println(rs.getString("col1")); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

ist das Ergebnis:

csv?à.py 
+0

Dies ist, weil pro Java-Dokumentation, Java-Style Character Encoding Name für Latin1 ist Cp1252. https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-charsets.html – user3566773

Antwort

0

Das ź Zeichen (Unicode-Codepunkt U+017A) nicht in dem latin1 Zeichensatz enthalten ist, so MySQL es nicht in einer latin1 Spalt speichern kann. (Für das Protokoll, ist es nicht in dem Windows-1252 Zeichensatz, auch nicht.)

Wenn Sie wirklich in dieser Spalte das Zeichen speichern müssen müssen Sie entweder zu

  • ändern Charakter der Spalte auf utf8 oder
  • mit Ihrem eigenen Weg, um manuell zu codieren und die Zeichenfolge zu entschlüsseln, damit es als latin1 Zeichen gespeichert werden kann (zum Beispiel so etwas wie csv\u017aà.py)

und stellen sie Ihren Code entsprechend ly.

+0

Ich verstehe das. Interessanterweise funktioniert es, wenn ich den MariaDB-Treiber anstelle des MySQL-Treibers verwende, der alles gleich macht. Ich bin in der Lage, diesen Namen zu speichern und ihn wieder sauber zu bekommen. Class.forName ("org.mariadb.jdbc.Driver"). NewInstance(); – user3566773

+1

Wie lautet die Zeichencodierung Ihrer '.java'-Quelldatei? –