这两天写一个数据备份的小工具,需要将数据备份到ACCESS数据库,在读写ACCESS数据库时总是出现乱码,这方面的资料网上异常的少,要么是连接方法要么就根本不解决问题的方法!
知道是字符集的问题,就试了各种字符集的设置都不能成功,只能通过万能的网络寻找强人,终于找到了这片专门论述jdbc操作ACCESS数据库读写乱码问题的博文。
为了便于以后查阅,也方便其它有同样问题的童鞋,原文整理如下:
我们知道,java的字符串都是unicode编码的,所以读出的任何字符串都被默认处理为unicode,因此,我们必须将取出来的byte强制转码为gbk,然后java会自动将该gbk编码转为unicode的字符串,输出。
conn = DriverManager.getConnection(
"jdbc:odbc:你的数据库;useUnicode=false;characterEncoding=gbk", "user", "yourpassword");
public String readDB(){
try {
sql = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = sql.executeQuery("select * from grdj");
// System.out.println(System.getProperties());
int i=1;
while (rs.next()) {
i++;
System.out.println(rs.getString(2));
System.out.println(new String(rs.getBytes(3),"gbk"));
System.out.println(rs.getString(4));
System.out.println(new String(rs.getBytes(5),"gbk"));
System.out.println(rs.getFloat(6));
System.out.println("-----------------");
}
System.out.println("all:"+i);
}catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(rs!=null){ rs.close();}
if(sql!=null){sql.close();}
if(conn!=null){conn.close();}
我们知道,java的字符串都是unicode编码的,所以读出的任何字符串都被默认处理为unicode,因此,我们必须将取出来的byte强制转码为gbk,然后java会自动将该gbk编码转为unicode的字符串,输出。
conn = DriverManager.getConnection(
"jdbc:odbc:你的数据库;useUnicode=false;characterEncoding=gbk", "user", "yourpassword");
public String readDB(){
try {
sql = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = sql.executeQuery("select * from grdj");
// System.out.println(System.getProperties());
int i=1;
while (rs.next()) {
i++;
System.out.println(rs.getString(2));
System.out.println(new String(rs.getBytes(3),"gbk"));
System.out.println(rs.getString(4));
System.out.println(new String(rs.getBytes(5),"gbk"));
System.out.println(rs.getFloat(6));
System.out.println("-----------------");
}
System.out.println("all:"+i);
}catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(rs!=null){ rs.close();}
if(sql!=null){sql.close();}
if(conn!=null){conn.close();}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
这是一个简单的示例。
但是insert还是出现乱码,问题我估计还是因为流得原因。
因此,必须采用DriverManager.getConnection()的第三种参数法
DriverManager.getConnection(url,Properties);
首先,设定当前流的默认字符集,这是一个持久的对象:
Properties prop = new Properties();
prop.put("charSet", "gbk");
然后如果数据库有密码,我们必须把用户名和密码的prop写完整
prop.put("user", "user");
prop.put("password", "yourpassword");
然后写url:"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + “你的mdb文件路径”
}
return null;
}
这是一个简单的示例。
但是insert还是出现乱码,问题我估计还是因为流得原因。
因此,必须采用DriverManager.getConnection()的第三种参数法
DriverManager.getConnection(url,Properties);
首先,设定当前流的默认字符集,这是一个持久的对象:
Properties prop = new Properties();
prop.put("charSet", "gbk");
然后如果数据库有密码,我们必须把用户名和密码的prop写完整
prop.put("user", "user");
prop.put("password", "yourpassword");
然后写url:"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + “你的mdb文件路径”
之后不管是读数据库还是写数据库,都不用再做任何的编码转换就可以进行了。
连接数据库完整语句示例:
conn = DriverManager.getConnection(" jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +
" E:/My Archives/Dry Clean data bak/ganxi/prodata.mdb", prop);
OK下来就正常连接select update insert吧!问题完美解决!感谢 lindily!
连接数据库完整语句示例:
conn = DriverManager.getConnection(" jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +
" E:/My Archives/Dry Clean data bak/ganxi/prodata.mdb", prop);
OK下来就正常连接select update insert吧!问题完美解决!感谢 lindily!