我在Fedora 17中使用firebird作为数据库在tomcat6上运行了一个JSF应用程序,并且从数据库到应用程序的所有寄存器都存在编码问题。
语言是巴西葡萄牙语,所以我需要é和ã和ç,所有这些特殊字符都存在问题。
原始源代码中的é和ã是好的,只有直接来自数据库的那些才会给我带来麻烦......
知道发生了什么事吗?
这是一个奇怪的角色应该是é
的图像
当它从数据库中恢复时会发生问题。
答案 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]
祝你好运!