使用 UCanAccess 的 MS Access '97 DB 字符集

Posted

技术标签:

【中文标题】使用 UCanAccess 的 MS Access \'97 DB 字符集【英文标题】:CharSet for MS Access '97 DB using UCanAccess使用 UCanAccess 的 MS Access '97 DB 字符集 【发布时间】:2020-01-13 10:37:28 【问题描述】:

嘿,我正在使用 ucanaccess-5.0.0 读取数据库。 该数据库可能是

jdbc:ucanaccess://$databaseFile.absolutePath;memory=false;charSet=Cp1250

它似乎被忽略了,因为我仍然没有从数据库中取出我的德语变音符号。

我该怎么办?

【问题讨论】:

【参考方案1】:

工作解决方案:

class DatabaseOpener : JackcessOpenerInterface 
  override fun open(fl: File, pwd: String?): Database 
    return DatabaseBuilder.open(fl).apply 
      this.charset = charset("Cp1252")
    
  


// URL
"jdbc:ucanaccess://<path-to-mdb-file>;memory=false;jackcessOpener=$DatabaseOpener::class.qualifiedName!!"

【讨论】:

【参考方案2】:

在java上:

public class CryptCodecOpener implements JackcessOpenerInterface 
    public Database open(File fl,String pwd) throws IOException 
        DatabaseBuilder dbd =new DatabaseBuilder(fl);
        dbd.setCodecProvider(new CryptCodecProvider(pwd));
        dbd.setCharset(Charset.forName("WINDOWS-1251"));
        return dbd.open();

    

public class MainTest 
    public static void main(String[] args) throws IOException 
        String connUrl = "jdbc:ucanaccess://C:/GATE/Server/config.mdb";
        try 
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
            Connection conn =
                    DriverManager.getConnection(connUrl + ";jackcessOpener=com.example.demo.CryptCodecOpener");
            Statement st = conn.createStatement();
            String sql = "SELECT * FROM Users LIMIT 10";
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) 
                System.out.println("\n" + rs.getString(1) + "\t" + rs.getString(3));
            
         catch (Exception e) 
            System.out.println(e.getMessage());
        
    

行家:

    <dependency>
        <groupId>net.sf.ucanaccess</groupId>
        <artifactId>ucanaccess</artifactId>
        <version>5.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.healthmarketscience.jackcess</groupId>
        <artifactId>jackcess-encrypt</artifactId>
        <version>3.0.0</version>
    </dependency>

【讨论】:

请解释你的答案。 WINDOWS-1251 是 MSAccess-97 的正确字符集,而不是问题中指定的 Cp1250 吗? 我在mdbviewer.herokuapp.com检查了我需要的数据库通过复制到这个站点2cyr.com/decodewindows-1251编码适合我来解密不可读的字符

以上是关于使用 UCanAccess 的 MS Access '97 DB 字符集的主要内容,如果未能解决你的问题,请参考以下文章

通过 UCanAccess 在 Eclipse 中“从表中生成实体”(MS Access)

如何在 UCanAccess 中设置 MS Access 数据库路径?

无法使用 DBeaver 和默认的 UCanAccess-5.0.0 驱动程序连接到 MS Access mdb 文件

Spring Boot / Data 通过 jdbc UCanAccess 连接到 MS Access

java直接存取MS Access的mdb数据库文件

如何从 Java 中的 InputStream 打开 MS Access 文件?