Java 从uCanAccess结果集中获取难以辨认的字符

Java 从uCanAccess结果集中获取难以辨认的字符,java,database,character-encoding,resultset,ucanaccess,Java,Database,Character Encoding,Resultset,Ucanaccess,我正在用西班牙语字符查询一个旧的Access 97数据库。我可以使用access很好地读取字符,因此我假设它使用ISO-8859-1,但是我无法将它们转换为UTF-8 不确定我的问题是否与我的连接有关: public static Connection baseAccess(String base) { try { java.util.Properties propiedades = new java.util.Properties(); propieda

我正在用西班牙语字符查询一个旧的Access 97数据库。我可以使用access很好地读取字符,因此我假设它使用
ISO-8859-1
,但是我无法将它们转换为UTF-8

不确定我的问题是否与我的连接有关:

public static Connection baseAccess(String base) {
    try {
        java.util.Properties propiedades = new java.util.Properties();
        propiedades.put("charSet", "ISO-8859-1");
        return DriverManager.getConnection(String.format("jdbc:ucanaccess://%s", base),propiedades);
    } catch (SQLException ex) {}
}
或者使用我对字符串的解析:

try (ResultSet rs = UtileriaDb.baseAccess(contabilidad).createStatement().executeQuery(sql);){
    while(rs.next()){
        String fromAccess = rs.getString(1);
        System.out.println(fromAccess);
        String transformed = new String(fromAccess.getBytes("ISO-8859-1"),"UTF-8");
        System.out.println(transformed);
    }
} catch (Exception ex) { }
因此,当我期待:

阿尼诺咖啡馆

我得到:

A�咖啡馆�

A?o咖啡馆

尝试通过执行以下操作从结果集中获取字节内容:
byte[]fromAccess=rs.getBytes(1)
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 incompatible data type in conversion: from SQL type VARCHAR to [B, value: myText
    at net.ucanaccess.jdbc.UcanaccessResultSet.getBytes(UcanaccessResultSet.java:339)

所以这是一条死胡同。有没有其他方法可以解决这个问题?

正如@Scratte正确指出的那样,
rs.getString(1)
正在返回一个已经包含替换字符的字符串。谢谢他帮我指点方向和方向

我最终实现了一个ucanaccess
JackcessOpenerInterface
,工作非常出色

package com.company.somepackage;

import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import net.ucanaccess.jdbc.JackcessOpenerInterface;

public class CharsetOpener implements JackcessOpenerInterface {
    public Database open(File f, String pwd) throws IOException {
        DatabaseBuilder db = new DatabaseBuilder(f);
        db.setCharset(Charset.forName("ISO-8859-1"));
        try {
            db.setReadOnly(false);
            return db.open();
        } catch (IOException e) {
            db.setReadOnly(true);
            return db.open();
        }
   }
}
对于我的连接生成器中的实现:

public static Connection baseAccess(String base) {
    try {
        java.util.Properties propiedades = new java.util.Properties();
        propiedades.put("jackcessOpener", "com.company.somepackage.CharsetOpener");
        return DriverManager.getConnection(String.format("jdbc:ucanaccess://%s", base),propiedades);
    } catch (SQLException ex) {}
}

请注意,实际属性是
jackcessOpener
,必须指向完全限定的类名。

您是在CLI还是IDE上运行此属性?
rs
的类型是什么?类型是
java.sql.ResultSet
刚刚更新了问题片段,我正在用
默认字符集=latin1
转换后的
字符串写入mySql表,非ascii值存储为
,输出来自netbeans终端,我也将尝试使用bash和cmd,我认为问题在于
rs.getString(1)
我会使用
byte[]bytes=rs.getBytes(1)
代替,然后
transformed=newstring(bytes,'ISO-8859-1')好主意!,然而,我在转换过程中得到了一个不兼容的数据类型:从SQL类型VARCHAR到[B,value:myText
。我认为ucanaccess不支持它。堆栈跟踪显示位于
net.ucanaccess.jdbc.UcanaccessResultSet.getBytes(UcanaccessResultSet.java:339)
下一个逻辑步骤将是您的假设“我假设它使用
ISO-8859-1
”:)