12
回答
在使用JFinal时遇到了汉字乱码问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

@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

举报
何煦
发帖于3年前 12回/3K+阅
共有12个答案 最后回答: 3年前

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/

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

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

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

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



@JFinal 已经添加了啊:

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

要不然JDBC也出不来汉字的

引用来自“JFinal”的评论

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

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



改成characterEncoding=utf8,还是同样的效果

引用来自“Windows10”的评论

检查下mysql默认编码是否是UTF8
已经检查了,不论是服务器、数据库还是表都是utf8

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

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

引用来自“何煦”的评论

@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 中 & 字符直接写即可,不能弄成: &

顶部