Firebird JDBC驱动程序连接字符编码

时间:2012-10-31 10:57:26

标签: java jdbc firebird fedora

我在Fedora 17中使用firebird作为数据库在tomcat6上运行了一个JSF应用程序,并且从数据库到应用程序的所有寄存器都存在编码问题。

语言是巴西葡萄牙语,所以我需要é和ã和ç,所有这些特殊字符都存在问题。

原始源代码中的é和ã是好的,只有直接来自数据库的那些才会给我带来麻烦......

知道发生了什么事吗?

这是一个奇怪的角色应该是é

的图像

datatable with the problem

当它从数据库中恢复时会发生问题。

3 个答案:

答案 0 :(得分:20)

在JDBC连接URL中使用encoding=ISO/UTF/WIN...查询参数解决了这个问题。

例如:

jdbc:firebirdsql:url:db?encoding=ISO8859_1

答案 1 :(得分:2)

如果未在Jaybird中指定连接字符集(使用Firebird字符集名称属性encoding或使用Java字符集名称指定charSet),则Jaybird会回退到连接字符集NONE的Firebird概念,这意味着服务器不会从(VAR)CHAR列的存储表示中音译字符并按原样发送其字节。

这意味着Jaybird接收未知字符集中的字节序列。然后,Jaybird将使用Java安装的默认字符集将这些字节转换为字符串。因此,如果db(或列)字符集与Java字符集不匹配,则可能会产生不正确的结果。更糟糕的是:以不同的系统使用不同的默认java字符集以这种方式读取和写入会产生总垃圾或音译错误。

解决方案:始终指定显式连接字符集。更好的方法是确保您的数据库具有默认字符集(或者每个(VAR)CHAR列都明确定义了其字符集)。

如果未指定显式连接字符集强制用户考虑此问题,则下一版本的Jaybird(2.3)可能会拒绝连接(如果他们仍然需要旧行为,那么他们可以明确指定encoding=NONE )。

答案 2 :(得分:0)

自从我到谷歌寻找答案后我才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]

祝你好运!