2011-08-28 53 views
2

我有DB,其中一些名字都寫立陶宛的信件,但是當我試圖讓他們用Java它忽略了立陶宛字母的Java不能訪問通過JDBC-ODBC檢索的Unicode(立陶宛)字母

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

在字段的DB類型是TEXT,大小爲20,不要使用任何額外的字母解碼或類似的東西。

它給了我「ImonėImone」,儘管在DB中寫有「Imonė」,它等於rus。

+1

您正在使用哪個數據庫,以及如何連接它? –

+0

訪問,使用JDBC –

+1

您需要提供更多詳細信息 - 確切的連接詳細信息以及編碼周圍的任何數據庫詳細信息。字段類型的細節也會有幫助。 –

回答

0

當您使用JDBC-ODBC橋接時,you can specify a charset in the connection details

試試這個:

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

String baza="jdbc:odbc:DatabaseDC"; 
connect=DriverManager.getConnection(baza, prop); 
+0

不,它不起作用 –

+0

檢查數據庫中的文本是否真的在UTF8或其他編碼:http://stackoverflow.com/questions/1467412/reading-unicode-data-from-an-access-database-using -jdbc – MarianP

+0

愚蠢的問題,但如何以及在哪裏檢查? –

0

嘗試使用這個 「Windows的1257」,而不是UTF-8,這是波羅的海地區。

java.util.Properties prop = new java.util.Properties(); 
prop.put("charSet", "Windows-1257"); 
2

現在,JDBC-ODBC橋已經從Java 8中卸下這個特定的問題將越來越成爲只是歷史價值的項目,但備案:

的JDBC-ODBC橋從來不打正確使用訪問ODBC驅動程序(「Jet」和「ACE」)代碼點U + 00FF以上的Unicode字符。這是因爲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 

( 'E' 是U + 0117)。

的JDBC-ODBC橋不明白它從訪問ODBC驅動程序是最後一個字符接收,所以它只是返回

Imon? 

在另一方面,如果我們試圖以存儲字符串使用UTF-8編碼的Access數據庫,如果JDBC-ODBC橋試圖插入字符串本身

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

該字符串UTF-8編碼的

因爲會發生

,然後訪問ODBC驅動程序將在數據庫中存儲它作爲

I m o n Ä — 
-- -- -- -- -- --------- 
49 6D 6F 6E C4 00 14 20 
  • C4是在「A」 Windows的1252是U + 00C4所以它被存儲爲剛剛C4
  • 97是「破折號」在Windows 1252爲U + 2014所以它被存儲爲00 14 20

現在JDBC-ODBC橋可以檢索它好(因爲訪問ODBC驅動程序「未軋液」字回到C4 97的出路),但如果我們在Access中打開的數據庫中,我們看到

ImonÄ— 

utf8Encoded.png

的JDBC-ODBC橋從未永遠能夠提供全本地Unicode支持Access數據庫。將各種屬性添加到JDBC連接將不會解決問題

對於沒有ODBC的Access數據庫的完整Unicode字符支持,請考慮使用UCanAccess代替。 (更多詳細信息請參見here。)

+0

我正在使用UCanAccess,但我有與阿拉伯語相同的問題,我有一個UTF-8字符編碼,但不是在訪問數據庫中有一個正常的阿拉伯詞,當我通過Java插入時,我得到像「#9-DF- * - 「,你爲什麼認爲這是發生? –

+0

@GherbiHicham請[請提出一個新問題](http://stackoverflow.com/questions/ask)以及相關詳細信息,包括您正在使用的代碼示例,並標記問​​題[tag:ucanaccess]。 –

相關問題