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();
}
テーブル作成コード:
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);
}
行の挿入:
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();
}
データを確認:
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);
}
}
出力:
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 - Апарати
>>> 12656697 - ???????
問題:表のテキストフィールドに「???????????」記号が表示されています。
期待される文字列は:Апарати
結果:???????
ある種のmagic
私は問題を解決しました...しかし、smbdがそれを説明してくれれば感謝します。
そう。
動作しています!!!:)
MySQL構成エンコーディングが正しく定義されていることを確認します。次のコマンドを使用して、設定と変更の正確さを確認します。
show variables like 'character%';
およびshow variables like 'collation%';
これらの行をmy.cnfまたはmy.iniのいずれかに追加します。
MySQL 5.1.nn以降のバージョン5.5.29では、次の2行が必要です。
[mysqld]
character-set-server = utf8
character-set-filesystem = utf8
MySQL 5.0.nn以前では、次の設定を使用します。
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
character-set-server=utf8
設定に MySQL-Workbench を使用する方がおそらく便利です。バージョン5+は優れています。
あなたのJavaプログラムでこのように接続します:
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase?useUnicode=true&characterEncoding=UTF-8","user","passwd");
あなたが取得する場合 ?????????
パラメータを追加しますcharacterEncoding=utf-8
の代わりに useUnicode=true
。次の例を参照してください。
英語のテキストの場合:
String url = "jdbc:mysql://localhost:" + port + "/DBName?useUnicode=true&...";
ロシア語のテキスト:
String url = "jdbc:mysql://localhost:" + port + "/DBName&characterEncoding=utf-8&...";