我有一个带有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应用程序中做同样的事情。我一直在努力解决这个问题,任何帮助都会受到赞赏。
我的应用程序使用以下内容:
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();
}