2013-10-05 4 views
1

У меня есть некоторые нестандартные символы в моей базе данных Access 2010. Когда я прочитал их черезЧтение символов Юникода из базы данных Access через JDBC-ODBC

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"); 
} 

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

+0

возможно дубликат [проблемы символов Java ODBC MS-Access Unicode] (HTTP: // StackOverflow.com/questions/21944861/java-odbc-ms-access-unicode-character-problems) –

ответ

0

Я ожидаю, что ваш драйвер 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, который запускает программу.

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

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

0

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

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

A bug report был подан Sun в ноябре 2005 года, в котором изложена проблема. Этот доклад был закрыт, как «не исправит» в апреле 2013 года с комментарием

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

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

Manipulating an Access database from Java without ODBC

1

я имел знаки вопроса, когда DB содержал польские символы. Он был исправлен, когда я установил кодировку 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 
} 
+0

Настройка свойства charSet сделала трюк для меня, спасибо! –

0

Это не «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); 
Смежные вопросы