Specify firebird connection dialect, not database dialect
我有一个使用方言1的Firebird数据库。某些旧的Delphi应用程序必须使用方言1进行配置,否则某些查询将失败。问题是,我正在使用ColdFusion与Web应用程序的数据库进行通信,并且它需要方言3。
有什么方法可以在客户端连接级别设置方言?这样我的ColdFusion数据源可以使用方言3,而旧的Delphi应用程序仍然可以使用方言1?
我尝试使用以下内容,但它根本不起作用。
1
| jdbc:firebirdsql:localhost/3050:C:\\fbdb\\master25.fdb?sql_dialect=3 |
当我这样做时,它完全改变了方言,使方言3中断了Delphi应用程序。
1
| jdbc:firebirdsql:localhost/3050:C:\\fbdb\\master25.fdb?set_sql_dialect=3 |
有什么想法吗?我正在使用Jaybird JDBC驱动程序从ColdFusion连接。
更新
问题在于Firebird 3.0似乎发生了变化。在方言1下的2.5数据库中,我们存储了将参数声明为日期的存储过程。在Firebird 3.0中,方言1下,这些存储过程引发错误,指出
Database SQL dialect 1 does not support reference to DATE datatype
当我们切换到Dialect 3时,所有东西都可以工作-但是我们的Delphi应用程序中断了,因为其中许多应用程序都具有直接查询功能,它选择了Firebird 3.0现在将其视为TIMESTAMP的日期类型列。因此,例如现在我们不再获得2018-06-25的信息,而是获得2018-06-25 23:59:59。
如果可以通过某种方式进行设置,以便我们的Delphi应用程序可以作为方言1进行通信,还可以使ColdFusion数据源作为方言3进行通信,那将是理想的选择。
那有可能吗?
- 您正在使用哪个版本的Jaybird?无论如何,方言1的数据库将永远不会完全是方言3的,因为在存储级别上也存在许多差异。请注意,第二个示例将更改方言,这就是为什么该属性包括set_sql_dialect中的set的原因。
-
您可能还想确切地包含ColdFusion遇到的问题,因为Jaybird 2.2.x将始终使用方言3,而Jaybird 3将始终使用方言3,除非明确告知不要这样做。
-
@MarkRotteveel-更新为包含我们遇到的确切错误
-
具体来说,您使用的是哪个Jaybird版本?您能否发布可复制的测试用例(请不涉及ColdFusion)。无论如何,您是否尝试过将连接方言明确指定为1,因为正如我所说,Jaybird将默认为方言3。在方言1中,DATE包含时间(实际上是方言3 TIMESTAMP)。
-
您得到的错误也将出现在2.5.8中。您以前的Firebird是否为2.5.4或更早版本,因为据我所知,此错误消息是Firebird 2.5.5中引入的,目的是避免方言不匹配。
-
我正在使用JayBird 3.0.4驱动程序
-
您能在Firebird-java邮件列表中问这个问题吗?我无法触发您的错误(尽管我可以触发可能具有类似潜在原因的错误),尽管我有很多理论,但是Stack Overflow并不是用于故障排除和验证这些理论的合适格式。
-
另外,您的期望是错误的。方言1 DATE是一个时间戳,因此它应包含时间信息。如果之前没有这样做,则说明您的数据库不是真正的方言1,或者发生了一些麻烦(Firebird现在已明确阻止DATE的方言1和方言3含义的混合)。
-
@MarkRotteveel-我是否可以为JDBC驱动程序创建一个自定义版本,默认为Dialect 1(而不是3)?我想您会问的,因为您是该驱动程序的开发人员。
-
无需这样做,只需在连接字符串中指定dialect=1(或sqlDialect=1),它将显式使用方言1。
-
@MarkRotteveel-确认一下,我的连接字符串如下所示。 jdbc:firebirdsql:localhost / 3050:C:\\\\\\\\ fbdb \\\\\\\\ master25.fdb?dialect ?? = 1-对吗?
-
是的,那将是正确的格式(或jdbc:firebirdsql://localhost:3050/C:\\fbdb\\master25.fdb?diale??ct=1,这是首选格式)
-
错误"数据库SQL方言1不支持对DATE数据类型的引用"可能表明您使用的表达式导致方言3类型为DATE(没有时间分量)的值,例如,使用了<x9 >。方言1 DATE包含时间分量,等效于方言3 TIMESTAMP。
要回答标题所隐含的问题(不解决问题正文的具体问题):您可以使用连接属性dialect(别名为sqlDialect和sql_dialect)指定连接方言值1(传统方言1),2(桥梁方言)和3(当前方言)。从技术上讲,0(基于数据库方言的自动选择)也可以工作,但是在某些情况下,即使数据库是方言1,也无论如何都会使用方言3。默认值为方言3。
以上内容适用于Jaybird 3.0.x,使用Jaybird 2.2.x及更早版本的方言选择将应用指定的方言和方言3的组合,因此应视为已损坏。