JDBC操作Firebirdのデータベース文字化け緊急ソリューション

もともとコーディングは、Delphiで、もちろん、読み取りを選択し、書き込み中国人が正常であるされていないときにデータベースを構築し、Firebirdのデータベースを使用してデルファイによって開発されたシステムがあります。それはリモート同期であるため、元のシステムは、現在、他のデータベースからのデータを同期する機能を追加する必要があり、データ同期量が大きくない、1日4回の頻度は、埋め込まれた桟橋を使用する簡単なハンドラは、この機能を実現書きますクライアントは、データのアップロードのためにHTTPClientを使用しています。クライアントとサーバの間の双方向の認証とHTTPSモード。

破片の食事の走り書きは、最終的には、ベース・コード、実行、データオーバーめまい、同期を終えFirebirdのを書いて、実際に文字化けします。マニュアルによるFirebirdのJDBCドライバjaybirdは、追加するJDBC接続文字列?LC_CTYPE = GBK役に立たない、まだ文字化けを言います。

データベースに書き込むための正しい文字、私は知らない別の方法が、緊急の次の方法を実証するためのテストを繰り返した後、何かのために良いです、主なアイデアは、のprepareStatementを使用することで、フィールドの内容は、方法パラメータですべての文字列を書かれていますフィールド、メソッドをsetStringを、代わりにsetBytes様式、GBKとの変換パラメータを使用しません。

コードスニペット:

class.forName("org.firebirdsql.jdbc.FBDriver");
Connection conn = DriverManager.getConnection(
		"jdbc:firebirdsql://localhost:3050/D:/db/card.fdb",
		"sysdba", "masterkey");
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement("insert into CARDLOGCOPY values(?, ?, ?, ?, ?)");
try {
	//循环插入新记录
	for(int i = 0, n = records.size(); i < n; ++i) {
		JSONArray record = records.getJSONArray(i);
		for(int j = 0, m = record.size(); j < m; ++j) {
			Object val = record.get(j);
			if(val instanceof String)
				pstmt.setBytes(j + 1, ((String)val).getBytes("GBK"));
			else if(val instanceof Date)
				pstmt.setString(j + 1, String.format("%tF %<tT", val));
			else
				pstmt.setObject(j + 1, val);
		}
		pstmt.execute();
		pstmt.clearParameters();
	}
	conn.commit();
}
catch (Exception e) {
	rollback(conn); //回滚事务
	logger.error("数据库操作出错,事务回滚.", e);
	throw e;
}
finally {
  pstmt.close;
  conn.close;
}



ます。https://my.oschina.net/kivensoft/blog/549365で再現

おすすめ

転載: blog.csdn.net/weixin_34255793/article/details/92058671