第一背景。
我使用Java编写桌面应用程序作为Eclipse RCP(efxclipse)。 我的配置:
数据库表示例:
CREATE TABLE MYTABLE (
ID CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS NOT NULL CONSTRAINT PK_MY_INDEX PRIMARY KEY,
DATA VARCHAR(100)
);
HikariCP设置为
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(100);
config.setDataSourceClassName("org.firebirdsql.pool.FBSimpleDataSource");
config.addDataSourceProperty("databaseName", cfg.getDbConnection());
config.addDataSourceProperty("user", cfg.getDbUser());
config.addDataSourceProperty("password", cfg.getDbPassword());
config.addDataSourceProperty("encoding", "UTF8");
//config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?");
config.setMaximumPoolSize(cfg.getDbPoolSizeMax());
HikariDataSource ds = new HikariDataSource(config);
ds.setConnectionTimeout(5000);
//我使用UUID作为主键,而对于获取行,我使用像
这样的代码Connection con = ds.getConnection();
query = "SELECT DATA FROM MYTABLE WHERE ID=char_to_uuid(?)";
PreparedStatement p = con.prepareStatement(query);
p.setString(1, id);
其中“id”是字符串,其值为'57F2B8C7-E1D8-4B61-9086-C66D1794F2D9'
直到上周,我在我的电脑上使用了Firebird 2.5.2xxx和Jaybird 2.2.8,这个设置绝对没有问题。然后我将我的firebird安装升级到版本2.5.5.26952并出现问题。
问题:
升级到Firebird 2.5.5代码部分后,我获取已知“id”的行抛出异常
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544606. expression evaluation not supported
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:782) ~[na:na]
at org.firebirdsql.jdbc.AbstractPreparedStatement.executeQuery(AbstractPreparedStatement.java:177) ~[na:na]
at com.zaxxer.hikari.proxy.PreparedStatementProxy.executeQuery(PreparedStatementProxy.java:52) ~[na:na]
at com.zaxxer.hikari.proxy.HikariPreparedStatementProxy.executeQuery(HikariPreparedStatementProxy.java) ~[na:na]
...
Caused by: org.firebirdsql.gds.GDSException: expression evaluation not supported
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.readStatusVector(AbstractJavaGDSImpl.java:2092) ~[na:na]
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.receiveResponse(AbstractJavaGDSImpl.java:2042) ~[na:na]
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlExecute2(AbstractJavaGDSImpl.java:1149) ~[na:na]
at org.firebirdsql.gds.impl.GDSHelper.executeStatement(GDSHelper.java:232) ~[na:na]
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:774) ~[na:na]
“id”的值是36个字符长度的字符串(我检查过它直到上周)。我仍然在这里切换到Jaybird 2.2.9问题。 据我所知,这与发送参数值为UTF8字符串(长度为x 4)有关,所以我改变了我的代码如下所示:
p.setObject(1, id.getBytes(StandardCharsets.US_ASCII));
同样,没有结果,同样的问题。
这也可能与Jaybird连接参数 octetsAsBytes 有关,但我无法正确应用它(通过HikariCP)。 我试过了
config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?");
在HikariCP设置但结果没有改变。
提前致谢。
答案 0 :(得分:1)
我可以在Firebird 2.5.4,2.5.5中重现这一点,并且Firebird 3的最新快照(2.5.3及更早版本似乎不受影响)。我已经能够重现这一点,问题似乎出现在Firebird本身。
如前所述,解决方法是将参数强制转换为显式字符集:
char_to_uuid(cast(? as char(36) character set utf8))
我在Firebird跟踪器中创建了一张票据来报告:CORE-5062,它将在Firebird 2.5.6和Firebird 3 RC2中修复