JOOQ非utf8编码问题
JOOQ non utf8 encoding issue
有没有办法指定使用哪种编码从 JOOQ 生成 sql 查询?我们有非 UTF-8 编码的 oracle 数据库,并且生成的相等字符串条件查询包含 UTF-8 字符
默认情况下,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
or a data type 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; }
}
有没有办法指定使用哪种编码从 JOOQ 生成 sql 查询?我们有非 UTF-8 编码的 oracle 数据库,并且生成的相等字符串条件查询包含 UTF-8 字符
默认情况下,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
or a data type 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; }
}