使用JDBC从Oracle数据库中读取带有撇号引号(`)的文本会导致出现奇怪的字符

时间:2017-10-27 12:02:53

标签: java oracle jdbc utf-8 character-encoding

我有一个带有Clob类型列的Oracle表,它应该存储大量文本。我使用Java和JDBC来存储和查询数据。

有时我们会从包含单引号撇号(`)的Word文档中复制/粘贴文本。但是当我们检索它时,我们的应用程序似乎将引用转换为一些不可读的奇怪字符。我遇到的问题类似于this article中解释的问题。

但是我们无法将列切换为blob作为解决方案。我们的数据库字符编码是 AL32UTF8 ,Java应用程序也使用 UTF-8 编码。当我使用SQL Developer或TOAD查询它时,无论字符编码是 UTF-8 还是 CP-1252 ,它看起来都很好。因此,这些工具以某种方式知道如何巧妙地转换它。

但是我无法用Java做到这一点。我尝试在写入和阅读时将文本编码为 UTF-8 ,并且它的不同组合无效。

如果我将文本转储到文件中并在记事本中打开它看起来没问题,但如果我在Unix编辑器中打开,我可以看到被破坏的字符。如果我将应用程序的编码切换为 CP-1252 ,它将正常工作,但我无法做到这一点,因为此文本在不同的系统中消耗, UTF-8 是这些应用程序之间达成一致的协议,我无法改变它。

我想知道SQL Developer在内部做什么,并在我的Java应用程序中做同样的事情。我一直在努力解决这个问题,任何帮助都会受到赞赏。

我的应用程序使用以下内容:

  • Oracle 12c
  • Java 8
  • ojdbc7-12.1.0.2.0.jar
public String getContent(){
    String query ="select clob_column from my_table";
    Connection conn = DriverManager.getConnection(connectionString,   user,password);
    Statement stmt= conn.createStatement();
    ResultSet rs = stmt.executeQuery();
    while(rs.next()){
    java.sql.Clob clobObject = (java.sql.Clob) rs.getObject(1);
    Reader reader = clobObject.getCharacterStream();
    StringBuilder sb= new StringBuilder();
    BufferedReader br = BufferedReader (reader);
    String line;
    while(line = br.readLine()) !=null){
    sb.append(line)
    br.close();
    }
    rs.close();
    stmt.close();
    conn.close();
    return sb.toString();
}

0 个答案:

没有答案