我们有一个具有以下字符集设置的Oracle数据库
SELECT参数,值FROM nls_database_parameters WHERE参数,如'NLS%CHARACTERSET'
NLS_NCHAR_CHARACTERSET: AL16UTF16
NLS_CHARACTERSET: WE8ISO8859P15
在这个数据库中,我们有一个带有CLOB字段的表,该字段的记录以下面的字符串开头,显然存储在ISO-8859-15中:X²ARB(这里正确转换为unicode) ,特别是2-superscript是重要且正确的。)
然后我们有以下微不足道的代码来获取值,这应该通过Oracle中的全球化支持自动将charset转换为unicode:
private static final String STATEMENT = "SELECT data FROM datatable d WHERE d.id=2562456";
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
try (Connection conn = DriverManager.getConnection(DB_URL);
ResultSet rs = conn.createStatement().executeQuery(STATEMENT))
{
if (rs.next()) {
System.out.println(rs.getString(1).substring(0, 5));
}
}
}
运行代码打印:
ojdbc8.jar和orai18n.jar:X�ARB - 错误
ojdbc7.jar和orai18n.jar:X�ARB - 错误
ojdbc-6.jar:X²ARB - 正确
使用UNISTR并将语句更改为SELECT UNISTR(data) FROM datatable d WHERE d.id=2562456我可以使ojdbc7.jar和ojdbc8.jar返回正确的值,但这需要进行未知数量的更改这个代码可能不是问题发生的唯一地方。
我可以对客户端或服务器配置做些什么来使所有查询返回正确编码的值而不进行语句修改?