У меня есть БД, где некоторые имена написаны литовскими буквами, но когда я пытаюсь получить их с помощью java, он игнорирует литовские буквы

    DbConnection();
    zadanie=connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    sql="SELECT * FROM Clients;";   
    dane=zadanie.executeQuery(sql);

    String kas="Imonė";
    while(dane.next())
    {
         String var=dane.getString("Pavadinimas");       
         if (var!= null) {var =var.trim();} 
         String rus =dane.getString("Rusys");   
         System.out.println(kas+" "+rus);
    }

    void DbConnection() throws SQLException
    {
        String baza="jdbc:odbc:DatabaseDC"; 
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(Exception e){System.out.println("Connection error");}
        connect=DriverManager.getConnection(baza);
    }

В БД тип поля - ТЕКСТ, размер 20, не используйте дополнительную расшифровку букв или что-то в этом роде.

Это дает мне "Imonė Imone", несмотря на то, что в БД написано "Imonė", что равно рус.

2
Edgar Buchvalov 28 Авг 2011 в 21:10

3 ответа

Лучший ответ

Поскольку вы используете мост JDBC-ODBC, вы можете укажите кодировку в деталях подключения.

Попробуй это:

Properties prop = new java.util.Properties();
prop.put("charSet", "UTF-8");

String baza="jdbc:odbc:DatabaseDC"; 
connect=DriverManager.getConnection(baza, prop);
0
Jon Skeet 28 Авг 2011 в 17:57

Теперь, когда мост JDBC-ODBC был удален из Java 8, этот конкретный вопрос все чаще становится просто предметом исторического интереса, но для записи:

Мост JDBC-ODBC никогда не работал правильно с драйверами Access ODBC («Jet» и «ACE») для символов Unicode над кодовой точкой U + 00FF. Это связано с тем, что Access хранит такие символы как Unicode, но не использует кодировку UTF-8. Вместо этого он использует "сжатый" вариант UTF-16LE, где символы с кодовыми точками U + 00FF и ниже хранятся как один байт, а символы выше U + 00FF хранятся как нулевой байт, за которым следует их пара байтов UTF-16LE. (s).

Если строка Imonė хранится в базе данных Access и правильно отображается в самом Access

accessEncoded.png

Тогда он сохраняется как

I  m  o  n  ė
-- -- -- -- --------
49 6D 6F 6E 00 17 01

(«Э» - это U + 0117).

Мост JDBC-ODBC не понимает, что он получает от драйвера Access ODBC для этого последнего символа, поэтому он просто возвращает

Imon?

С другой стороны, если мы попытаемся сохранить строку в базе данных Access с кодировкой UTF-8, как это произойдет, если мост JDBC-ODBC попытается вставить саму строку

Statement s = con.createStatement();
s.executeUpdate("UPDATE vocabulary SET word='Imonė' WHERE ID=5");

Строка будет в кодировке UTF-8 как

I  m  o  n  ė
-- -- -- -- -----
49 6D 6F 6E C4 97

А затем драйвер ODBC Access сохранит его в базе данных как

I  m  o  n  Ä  —
-- -- -- -- -- ---------
49 6D 6F 6E C4 00 14 20
  • C4 - это 'Ä' в Windows-1252, то есть U + 00C4, поэтому он сохраняется как C4
  • 97 - это длинное тире в Windows-1252, то есть U + 2014, поэтому он сохраняется как 00 14 20

Теперь мост JDBC-ODBC может получить его нормально (так как драйвер ODBC Access "восстанавливает" символ обратно в C4 97 на выходе), но если мы откроем базу данных в Access, мы увидим

ImonÄ—

utf8Encoded.png

Мост JDBC-ODBC никогда и никогда не сможет обеспечить полную встроенную поддержку Unicode для баз данных Access. Добавление различных свойств к соединению JDBC не решит проблему.

Для полной поддержки символов Юникода в базах данных Access без ODBC рассмотрите возможность использования вместо этого UCanAccess. (Более подробная информация доступна в другом вопросе здесь.)

4
Community 23 Май 2017 в 11:33

Попробуйте использовать "Windows-1257" вместо UTF-8, это для Балтийского региона.

java.util.Properties prop = new java.util.Properties();
prop.put("charSet", "Windows-1257");
0
09stephenb 1 Апр 2014 в 08:48