Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebird JDBC驱动程序连接字符编码_Java_Jdbc_Firebird_Fedora - Fatal编程技术网

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

Java Firebird JDBC驱动程序连接字符编码,java,jdbc,firebird,fedora,Java,Jdbc,Firebird,Fedora,我在Fedora17的tomcat6上运行了一个JSF应用程序,使用firebird作为数据库,并且从数据库到应用程序的所有寄存器都有编码问题 语言是巴西葡萄牙语,所以我需要é’s和ãs和ç,这里所有这些特殊字符都有问题 原始源代码中的é和ã还可以,只有那些直接来自数据库的代码给我带来了麻烦 知道发生了什么吗 这是一张照片,这个奇怪的角色应该在这里 当它从数据库中恢复时会出现问题。使用JDBC连接URL中的encoding=ISO/UTF/WIN…查询参数解决了问题 例如: jdbc:fire

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

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

原始源代码中的é和ã还可以,只有那些直接来自数据库的代码给我带来了麻烦

知道发生了什么吗

这是一张照片,这个奇怪的角色应该在这里


当它从数据库中恢复时会出现问题。

使用JDBC连接URL中的
encoding=ISO/UTF/WIN…
查询参数解决了问题

例如:

jdbc:firebirdsql:url:db?encoding=ISO8859_1

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

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

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


< P>下一个版本的JayBube(2.3)如果不指定显式连接字符集,可能会拒绝连接以强制用户考虑这个问题(如果他们仍然想要旧的行为,那么他们可以明确地指定<代码>编码=No.< /代码>)。

< P> > 2美分,因为我是从谷歌来到这里寻找答案的。 我在interbase 7.5.80中使用遗留的jaybird驱动程序(v1.5)时遇到问题。 我在连接上使用的除“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");
并在创建具有特定编码的新字符串实例时使用getBytes:

String column = new String(rs.getBytes("column"), "Windows-1255");
[rs当然是结果集]


祝你好运

JSF1.x还是2.x?你到底在说什么“麻烦”?请提供更多细节。你看到的是哪些角色?它在哪一步显示错误的字符?在Java代码中直接从DB中检索之后?或者仅在生成的HTML输出中?DB(或特定列)的默认字符集是什么,连接字符集是什么,这些数据是来自BLOB SUB_类型文本还是(VAR)字符?尝试添加更多信息,但在具体失败时,您仍然不清楚。请从开发人员的角度而不是最终用户的角度来阐述这个问题。首先,在从数据库检索数据之后,直接在代码中放置调试断点、记录器或system.out.println,以便您可以调查JDBC驱动程序是否正确解码了它。请注意,您应该绝对确保IDE和logger/stdout控制台本身也使用了正确的字符集(即,您必须能够执行
System.out.println(“ãç”)
,并在控制台中看到它)。请注意,我假设字符已正确存储在数据库中。因此,如果您直接使用一些数据库管理工具查看数据库,那么这些字符看起来应该很好。否则,首先将其作为JSF问题发布是没有意义的。当您使用JSF2.x时(默认情况下,JSF2.x本身已经在所有层中使用UTF-8),我越来越认为问题实际上在DB设置或JDBC驱动程序配置中。谢谢!我还必须像这样处理和转义[jdbc:firebirdsql:url:db?roleName=XYZ&;encoding=UTF8],因为?仅适用于第一个参数。