我有一个 JSF 应用程序在 Fedora 17 的 tomcat6 上运行,使用 firebird 作为数据库,并且从数据库到应用程序的所有寄存器都带有编码问题。
语言是巴西葡萄牙语,所以我需要 é 和 ã 和 ç,而这里所有这些特殊字符都有问题。
原始源代码中的é和ã是可以的,只有直接来自数据库的那些给我带来了麻烦......
知道发生了什么吗?
这是一个奇怪的角色应该是é的图像
当它从数据库中恢复时,就会出现问题。
在 JDBC 连接 URL 中使用encoding=ISO/UTF/WIN...
查询参数已经解决了这个问题。
例如:
jdbc:firebirdsql:url:db?encoding=ISO8859_1
当您没有在 Jaybird 中指定连接字符集(encoding
使用 Firebird 字符集名称或charSet
使用 Java 字符集名称的属性)时,Jaybird 会退回到 Firebird 的连接字符集概念NONE
,这意味着服务器不会从 (VAR)CHAR 列的存储表示中音译字符并按原样发送其字节。
这意味着 Jaybird 接收到未知字符集中的字节序列。Jaybird 然后将使用 Java 安装的默认字符集将这些字节转换为字符串。因此,如果 db(或列)字符集与您的 Java 字符集不匹配,那么它可能会产生不正确的结果。更糟糕的是:以这种方式从具有不同默认 java 字符集的不同系统中读取和写入会产生完全的垃圾或音译错误。
解决方案:始终指定显式连接字符集。更好的是确保您的数据库具有默认字符集(或者每个(VAR)CHAR
列都有明确定义的字符集)。
如果没有指定明确的连接字符集来强制用户考虑这个问题,Jaybird (2.3) 的下一个版本可能会拒绝连接(如果他们仍然想要旧的行为,那么他们可以明确指定encoding=NONE
)。
自从我通过 Google 来到这里寻找答案以来,我的 2 美分。我在使用旧版 jaybird 驱动程序(v1.5)时遇到了 interbase 7.5.80 的问题。除了“NONE”之外,我在连接上使用的任何编码都会导致连接超时。最终我继续使用'NONE':
FBWrappingDataSource dataSource = new FBWrappingDataSource();
dataSource.setDatabase("url");
dataSource.setType("TYPE4");
dataSource.setEncoding("NONE");
dataSource.setLoginTimeout(10);
java.sql.Connection c = dataSource.getConnection("sysdba", "masterkey");
并在创建具有特定编码的新 String 实例时使用了 getBytes:
String column = new String(rs.getBytes("column"), "Windows-1255");
[rs当然是ResultSet]
祝你好运!