默认情况下,jOOQ不会触及绑定变量 - 它们会以您在查询中输入的方式传递给JDBC驱动程序.因此,如果您的String绑定变量以UTF-8编码,那就是它们被发送到数据库的方式:
COMMENTs.TEXT.eq("Schei? encoding");
Run Code Online (Sandbox Code Playgroud)
如果您传递给jOOQ的编码不是您希望在数据库中使用的编码,则至少需要以下选项来解决此问题:
当然,这应该是你的首要任务.如果UTF-8 通常是错误的编码,您应该已经在您的应用程序中修复它.例如,您的JVM可能使用错误的默认编码运行,或者您使用错误的编码解析了一些外部源.可以使用JVM标志设置默认编码:
-Dfile.encoding=utf8
Run Code Online (Sandbox Code Playgroud)
如果在一两种情况下编码只是错误的,您可以通过在将字符串传递给jOOQ之前进行转换来修复它.例如
COMMENTs.TEXT.eq(new String("Schei? encoding".getBytes(), "ISO 8859-1"));
Run Code Online (Sandbox Code Playgroud)
这应该只是偶尔进行,作为快速解决方案.
如果应用程序端编码是正确的,并且您确实希望在将所有字符串值传递给Oracle JDBC之前转换它们,则可以使用Converter或数据类型Binding将所有字符串从UTF-8转换为您的编码.例如:
public class CharsetConverter implements Converter<String, String> {
@Override
public String from(String databaseObject) {
return databaseObject == null ? null :
new String(databaseObject.getBytes(), "UTF-8"));
}
@Override
public String to(String userObject) {
return userObject == null ? null :
new String(userObject.getBytes(), "ISO 8859-1"));
}
@Override
public Class<String> fromType() { return String.class; }
@Override
public Class<String> toType() { return String.class; }
}
Run Code Online (Sandbox Code Playgroud)