【问题标题】:JOOQ non utf8 encoding issueJOOQ 非 utf8 编码问题
【发布时间】:2018-09-12 22:26:44
【问题描述】:

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

【问题讨论】:

  • 您是指 SQL 字符串(包括字符串文字)还是绑定变量?
  • 绑定变量,在输出日志中我们看到UTF8的值

标签: java jooq


【解决方案1】:

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

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

如果您传递给 jOOQ 的编码不是您希望在数据库中使用的编码,您至少有以下选项来解决这个问题:

修复原编码

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

-Dfile.encoding=utf8

修复传递给jOOQ时的编码

如果仅在一两种情况下编码错误,您可以通过在将字符串传递给 jOOQ 之前对其进行转换来修复它。例如

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; }
}

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多