JOOQ非utf8编码问题

时间:2016-04-06 15:41:10

标签: java jooq

有没有办法指定用于从JOOQ生成sql查询的编码?我们有非UTF-8编码的oracle数据库,并且生成的查询等于字符串条件包含UTF-8字符

1 个答案:

答案 0 :(得分:5)

默认情况下,jOOQ不会触及绑定变量 - 它们会以您在查询中输入的方式传递给JDBC驱动程序。因此,如果您的String绑定变量以UTF-8编码,那就是它们如何发送到数据库:

COMMENTs.TEXT.eq("Schei� encoding");

如果您传递给jOOQ的编码不是您希望在数据库中拥有的编码,则至少需要以下选项来解决此问题:

修复原始编码

当然,这应该是你的首要任务。如果UTF-8 通常编码错误,您应该已在应用程序中修复它。例如,您的JVM可能使用错误的默认编码运行,或者您使用错误的编码解析了一些外部源。可以使用JVM标志设置默认编码:

-Dfile.encoding=utf8

在将编码传递给jOOQ

时修复编码

如果在一两种情况下编码只是错误的,您可以通过在将字符串传递给jOOQ之前进行转换来修复它。 E.g。

COMMENTs.TEXT.eq(new String("Schei� encoding".getBytes(), "ISO 8859-1"));

这应该只是偶尔进行,作为快速解决方法。

使用jOOQ转换器转换字符串

如果应用程序端编码正确,并且您确实希望在将所有字符串值传递给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; }
}