通过 JDBC-ODBC 驱动程序从 Access 中选择时不显示丹麦语字符 [重复]

Posted

技术标签:

【中文标题】通过 JDBC-ODBC 驱动程序从 Access 中选择时不显示丹麦语字符 [重复]【英文标题】:Danish characters not displayed when selecting from Access through JDBC-ODBC Driver [duplicate] 【发布时间】:2014-07-09 22:17:37 【问题描述】:

我有一个 .mdb 访问数据库,我之前通过 vbs 脚本对其进行了更新,这需要将一些 .csv 文件从站点转储到指定目录中。

我意识到我加载 csv 文件的网站也有一个 web 服务,所以我决定通过它来加载。在测试时,我想知道为什么表中的数据没有被正确接收。所以我写了一个小测试脚本:

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import java.util.SortedMap;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConventusImport 



    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
        int jdkType = Integer.parseInt(System.getProperty("sun.arch.data.model"));
        if (jdkType != 32) 
            System.err.println("Running " + jdkType + " bit JDK - this may cause ODBC Issues. please run with 32-bit JDK");
        
        try 
            //SQL connection
            String mdbFileName = "F:/TestDatabase.accdb";
            String dbConnectString = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=" + mdbFileName;

            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Properties props = new Properties();
            props.put("charSet", "windows-1252");//virker ved inserts, men ikke ved selects
            Connection c = DriverManager.getConnection(dbConnectString, props);
            Statement stmt = c.createStatement();
            String query = "SELECT * FROM testTabel where id = 12"; // Ægår Ødisøn Ådisbærg
            stmt.executeQuery(query);
            ResultSet rs = stmt.getResultSet();
            ResultSetMetaData rsmd = rs.getMetaData();

            rs.next();
            byte[] rawBytes = rs.getBytes(2);

            String updateQuery = "insert into testTabel values(14, 'æøå ÆØÅ é€èéÈ')";
            stmt.executeUpdate(updateQuery);

            //run through all charsets available, and try to decode byte array
            SortedMap availableCharsetsMap = Charset.availableCharsets();
            Set keySet = availableCharsetsMap.keySet();
            Iterator it = keySet.iterator();
            if (rawBytes != null && rawBytes.length != 0) 
                while (it.hasNext()) 
                    Charset chset = (Charset) availableCharsetsMap.get((String) it.next());
                    String stringLine = new String(rawBytes, chset);
                    System.out.println(stringLine + "\t\t" + chset.name());
                
            
            c.close();
         catch (ClassNotFoundException ex) 
            Logger.getLogger(ConventusImport.class.getName()).log(Level.SEVERE, null, ex);
         catch (SQLException ex) 
            Logger.getLogger(ConventusImport.class.getName()).log(Level.SEVERE, null, ex);
        
    


我尝试了几个字符集,并且 cp1252 在我插入时有效,但是当我从 access 数据库中选择时,我得到 ?'s 而不是我期望的字符。

例如,Åse Sørensen 变为 ?se S?rensen

我能看到的唯一其他 stackexchange 帖子是相关的,不要解决我的问题Jdbc-odbc bridge with ms access don't understand greek characters? How to correctly return special Spanish characters from a MS Access db with jdbc-odbc driver

编辑:

我尝试过 UCANACCESS,它解决了 ODBC 和机器架构的很多问题..

很遗憾,我现在无法删除问题。

【问题讨论】:

您是否将丹麦字符正确存储在 DB 中? 是的 - 当我使用 cp1252 进行插入时,字符存储正确。 【参考方案1】:

如果您的数据库中正确存储了丹麦字符,那么您需要更改控制台设置以正确显示它们。控制台的默认编码通常不是 UTF-8,因此当您尝试打印时,它会显示为问号 (?)。

您可以通过以下方式更改 Eclipse 中的控制台设置:

Run Configuration > Common > Encoding > Select UTF8 from drop down.

【讨论】:

感谢有关控制台设置的提示,但我使用的是 netbeans,所以设置会有所不同...

以上是关于通过 JDBC-ODBC 驱动程序从 Access 中选择时不显示丹麦语字符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 和 Java JDBC-ODBC 错误

使用JDBC-ODBC连接Access数据库

通过 JDBC 访问 Access(使用 ODBC?)

如何从 Java JDBC-ODBC 桥访问 UniqueIdentifier 列

NetBeans IDE 6.1怎么通过JDBC-ODBC桥访问数据库sql server 2000

各类数据库的jdbc驱动及连接字符串总结