Получить неразборчивые символы из набора результатов uCanAccess - PullRequest
1 голос
/ 28 февраля 2020

Я запрашиваю старую базу данных access 97 с испанскими sh символами - ú í ó ú. Я могу нормально читать символы, используя 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ño Café

Я получаю:

A�o Caf�

A? O Caf?

Обновление: Попытка получить содержимое байта из набора результатов, выполнив: 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)

Так вот тупик, может быть есть другой способ go об этом?

1 Ответ

1 голос
/ 29 февраля 2020

Как правильно заметил @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 и должно указывать на полное имя класса.

...