Чтение символов Юникода из базы данных Access через JDBC-ODBC

У меня есть несколько нестандартных символов в моей базе данных Access 2010. Когда я читаю их через

Connection con = null;
try{
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    java.util.Properties prop = new java.util.Properties();
    prop.put("charSet", "UTF8");
    String database = "jdbc:odbc:Lb";
    con = DriverManager.getConnection(database, prop);
} catch (Exception ex) {
    System.out.println("Error");
}
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("SELECT distinct forename, surname from PSN where isValid");

while (rs.next()) {
    String forename = rs.getString("forename");
}

Я получаю знаки вопроса (?) где персонаж должен быть. Почему это?

4 ответа

У меня были вопросительные знаки, когда БД содержала польские символы. Это было исправлено, когда я установил кодировку charecter в windows-1250.

def establish(dbFile: File): Connection = {
  val fileName = dbFile.getAbsolutePath
  val database = s"${driver}DBQ=${fileName.trim};DriverID=22;READONLY=true}"
  val props = new Properties()
  props.put("charSet", "Cp1250")
  val connection= DriverManager.getConnection(database,props)
  connection
}

Я ожидаю, что ваш драйвер JDBC будет прозрачно обрабатывать чтение и запись символов в вашу базу данных. Внутреннее строковое представление Java - UTF-16.

Java(UTF-16)         --JDBC--> Database(DbEncoding)
Database(DbEncoding) --JDBC--> Java(UTF-16) 

Возможно, проблема в том, что вы пытаетесь заставить их читать с помощью UTF8, а база данных использует другое внутреннее представление?

Кроме того, как вы проверяете, что вы получаете '?'

Если задействован System.out, вы должны принять во внимание, что этот PrintStream преобразует в строках памяти в кодировку, которую он использует. IIRC этот Charset можно найти с помощью Charset.defaultcharset() и является свойством той JVM, которая запускает программу.

Желательно проверить шестнадцатеричное значение char и посмотреть таблицу Unicode, чтобы убедиться, что информация была потеряна при чтении из базы данных.

Надеюсь это немного поможет.

Это не "utf8", а "Cp1250"!

Надо использовать: ISO-8859-1

java.util.Properties prop = new java.util.Properties();
prop.put("charSet", "ISO-8859-1");
String connURL = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + accessFileName + ";uid=''; pwd='';";    
sql = "SELECT * FROM enq_horaires;";'
con = DriverManager.getConnection(connURL, prop);
stmt = con.createStatement();
ResultSet rset = stmt.executeQuery(sql);

Это давняя проблема совместимости между драйвером ODBC Access и мостом JDBC-ODBC. В Access хранятся символы Unicode с использованием разновидности кодировки UTF-16LE (не UTF-8), и мост JDBC-ODBC не может их получить.

(Обратите внимание, что это не проблема с драйвером ODBC Access как таковым, потому что другие инструменты, такие как pyodbc для Python может правильно извлечь символы Unicode. Это проблема совместимости между мостом JDBC-ODBC и драйвером ODBC для доступа.)

Сообщение об ошибке было подано в Sun в ноябре 2005 года с описанием проблемы. Этот отчет был закрыт как "Не исправлю" в апреле 2013 года с комментарием

Мост был удален из Java SE 8 и не поддерживается

Если вам нужно работать с произвольными символами Unicode в базе данных Access, вам следует рассмотреть возможность использования UCanAccess. Для получения дополнительной информации см.

Управление базой данных Access из Java без ODBC

Другие вопросы по тегам