· 7 years ago · Sep 04, 2018, 01:54 AM
1JDBC MySQL UTF-8 string writing problem
2public DBSource(ConnectionInfo ci) throws
3 ClassNotFoundException, InstantiationException,
4 IllegalAccessException, SQLException
5{
6 Class.forName("com.mysql.jdbc.Driver").newInstance();
7 String dbPath = String.format(
8 "jdbc:mysql://%s:%d/%s?user=%s&password=%s&characterEncoding=utf-8&" +
9 "useUnicode=true", ci.host, ci.port, ci.dbName, ci.user, ci.password);
10 conn = java.sql.DriverManager.getConnection(dbPath);
11 prepareTables();
12}
13
14private void prepareTables() throws SQLException
15{
16 java.sql.Statement stat = conn.createStatement();
17
18 String query = "set names utf8";
19 stat.execute(query);
20
21 query = "set character set utf8";
22 stat.execute(query);
23
24 query = "show variables like '%char%'";
25 stat.execute(query);
26 java.sql.ResultSet rs = stat.getResultSet();
27 while (rs.next())
28 {
29 String k = rs.getString(1);
30 String v = rs.getString(2);
31 System.out.println(k + " - " + v);
32 }
33
34 query = "drop table if exists clt";
35 stat.execute(query);
36 query = "create table clt"
37 + "("
38 + " id bigint not null"
39 + ", text varchar(50) not null"
40 + ") default character set utf8";
41 stat.execute(query);
42}
43
44public void visit(Insert i) throws SQLException
45{
46 String query = "insert into clt"
47 + " (id, text) values (?, ?)";
48 java.sql.PreparedStatement stmt = conn.prepareStatement(query);
49 if (i.rowData.id == 12656697)
50 {
51 String toOut = "<<< " + Long.toString(i.rowData.id) + " - " + i.rowData.text;
52 System.out.println(toOut);
53 }
54 int it = 0;
55 stmt.setLong(++it, i.rowData.id);
56 stmt.setString(++it, i.rowData.text);
57 stmt.execute();
58 stmt.close();
59}
60
61public void checkText() throws SQLException
62{
63 java.sql.Statement stmt = conn.createStatement();
64 String query = "select id, text from clt where id = '12656697'";
65 stmt.execute(query);
66 java.sql.ResultSet rs = stmt.getResultSet();
67 while (rs.next())
68 {
69 String k = rs.getString(1);
70 String v = rs.getString(2);
71 String toOut = ">>> " + k + " - " + v;
72 System.out.println(toOut);
73 }
74}
75
76character_set_client - utf8
77character_set_connection - latin1
78character_set_database - latin1
79character_set_filesystem - binary
80character_set_results - utf8
81character_set_server - utf8
82character_set_system - utf8
83character_sets_dir - /usr/share/mysql/charsets/
84
85<<< 12656697 - Ðпарати
86>>> 12656697 - ???????
87
88[client]
89default-character-set=utf8
90
91[mysql]
92default-character-set=utf8
93
94[mysqld]
95default-character-set=utf8
96character-set-server=utf8