Чтение символов Юникода из базы данных 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. Для получения дополнительной информации см.