在使用JFinal时遇到了汉字乱码问题

何煦 发布于 2014/11/18 18:09
阅读 4K+
收藏 0

@JFinal 你好,想跟你请教个问题:

在开发中我遇到一个问题,之前tomcat与mysql在同一台服务器时一切运行正常。当我将mysql移到另一台服务器后就出现了汉字乱码问题。测试代码如下:

public void test() {
Random r = new Random();

try {
Connection conn = createConnection();
Statement st = conn.createStatement();
String sql = "insert into encode_test values(" + r.nextInt() + ", '汉字测试jdbc')";
System.out.println("SQL: " + sql);
st.execute(sql);
st.close();
conn.close();

conn = DbKit.getConfig().getConnection();
st = conn.createStatement();
sql = "insert into encode_test values(" + r.nextInt() + ", '汉字测试c3p0')";
System.out.println("SQL: " + sql);
st.execute(sql);
st.close();
conn.close();


sql = "insert into encode_test values(" + r.nextInt() + ", '汉字测试DB')";
Db.update(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
renderText("OK");
}


其中用原生态JDBC连接汉字是正常的,后两种方法汉字都变成了问号,请问有什么方法可以解决。

PS:用的是同一个JDBCUrl

加载中
1
何煦
何煦

JDBC直连是这样的:

character_set_client            utf8

character_set_connection                utf8
character_set_database          utf8
character_set_filesystem                binary
character_set_results
character_set_server            utf8
character_set_system            utf8

character_sets_dir              /data/mysql_root/base/share/charsets/

取JFinal中的连接是这样的:

character_set_client            latin1
character_set_connection                latin1
character_set_database          utf8
character_set_filesystem                binary
character_set_results
character_set_server            utf8
character_set_system            utf8

character_sets_dir              /data/mysql_root/base/share/charsets/

在同一个程序里两种不能的连接方式得到的结果就是不一样,用的连接串也完全是一样的。真搞不明白。

JFinal
JFinal
c3p0 之下加上 charcterEncoding=utf8 试试:jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf8
1
何煦
何煦
@JFinal  这个应该是c3p0的BUG,我自己写了一个poolman的插件,能正常运行,汉字也完全正常了。只是因为用了poolman所以会多一个配置文件,与jFinal的理念不符。不过能正常运行就好。
JFinal
JFinal
数据库乱码的问题与很多情况有关:数据库系统默认字符集、数据库字符集、表字符集、字段字符集、数据库连接 url 字符集,所以需要小心
0
JFinal
JFinal

jdbcUrl 中添加 characterEncoding=utf8,如下是一个例子:

jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf8



0
何煦
何煦

@JFinal 已经添加了啊:

jdbc.url=jdbc:mysql://127.0.0.1/ospm?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

要不然JDBC也出不来汉字的

0
何煦
何煦

引用来自“JFinal”的评论

jdbcUrl 中添加 characterEncoding=utf8,如下是一个例子:

jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf8



改成characterEncoding=utf8,还是同样的效果
0
91porn
91porn
检查下mysql默认编码是否是UTF8
0
何煦
何煦

引用来自“Windows10”的评论

检查下mysql默认编码是否是UTF8
已经检查了,不论是服务器、数据库还是表都是utf8
0
JFinal
JFinal
先定位一下是哪个环节出的乱码,System.out.println("SQL: " + sql); 这句输出到控制台是不是乱码?
0
何煦
何煦

@JFinal  是的,但这个乱码并不影响JDBC插入时是正确的。

SQL: insert into encode_test values(849974136, '姹夊瓧娴嬭瘯jdbc')
SQL: insert into encode_test values(1014399843, '姹夊瓧娴嬭瘯c3p0')

0
JFinal
JFinal

引用来自“何煦”的评论

@JFinal 已经添加了啊:

jdbc.url=jdbc:mysql://127.0.0.1/ospm?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

要不然JDBC也出不来汉字的

改成下面这样试试:

jdbc.url=jdbc:mysql://127.0.0.1/ospm?characterEncoding=utf8



记得要 copy 上面这行,不要手写,怀疑 characterEncoding 没生效,多个减号。并且你的 & 字符的用法是在 xml 才需要的用法,在 properties 中 & 字符直接写即可,不能弄成: &

返回顶部
顶部