JDBC SQL:详细规范在哪里?

时间:2013-06-27 09:47:52

标签: sql postgresql jdbc portability

每个人都喜欢提及JDBC如何抽象出SQL之间特定于供应商的差异,以呈现一种可以对付其中一大部分的SQL风格。

但是没有关于JDBC的书或参考文献提到(详细的)规范,甚至是JDBC(特定版本)支持的这种SQL的体面,用户空间覆盖,比如JDBC 4.1!

所以,最终发生的事情(至少在我身上)是,如果我正在使用MySQL,我必须参考MySQL参考手册,然后尝试防止自己不小心使用MySQL特有的功能。对于编写可移植SQL(至少在我正在使用的JDBC驱动程序版本支持的级别),我宁愿直接引用JDBC规范或SQL规范,而不是引用MySQL,PostgresQL等。

特定版本的JDBC所基于的SQL标准本身(2008,2003等)是否可以免费获得?或者,我是否需要发布$$才能获得副本?

2 个答案:

答案 0 :(得分:4)

没有“JDBC SQL”,只有ISO SQL及其供应商实现。 JDBC定义了与SQL数据库交谈的接口,它与查询语言的自身不同。

JDBC的引用本身就是JSR文档:

不幸的是,官方SQL标准很昂贵,必须从ISO购买。

当您不尝试在其他地方开发符合要求的实施here时,您可以找到非常适合参考的后期草稿。

SQL规范并不是最友好和最易读的东西,因此在实践中使用供应商文档是一个好主意,而这些文档实际上是供人类阅读的。您可以比较几个供应商文档,或者在出现不确定性时依靠标准文档。

标准符合规范并不完全适用于DB;严格按照规范编写代码并不一定意味着它实际上会起作用。例如,MySQL没有实现窗口函数或公用表表达式,PostgreSQL没有实现SQL / PSM(而是提供PL / PgSQL)或CALL语句;大多数供应商使用不同的方式指定自动增量列或序列生成器;等等等。

请不要使用w3schools SQL指南,它们严重过时,错误,无法区分供应商扩展和标准,并且通常应该避免。我之所以提到它们是因为w3schools在搜索排名中往往相当高 - 回到他们过去实际有用的那一天。

答案 1 :(得分:2)

您可以从http://download.oracle.com/otndocs/jcp/jdbc-4_1-mrel-spec/index.html下载JDBC 4.1规范,但这仅涵盖JDBC本身,而不是SQL。规范更多是对接口的描述;它确实希望数据库支持某些级别的SQL标准,但如果涉及查询要求,则不希望找到比SQL标准引用更多的信息。

您通常需要使用特定于数据库的SQL,因为即使存在SQL标准,数据库供应商也不会将其实现。 JDBC本身定义了一些弥补差距的漏洞,但据我所知,它们几乎从未使用过。驱动程序 - 通常 - 如果数据库不支持标准SQL,则不会将标准SQL转换为特定于数据库的SQL。

如果您想查看官方SQL标准,您需要从ISO或您所在国家/地区的ISO代表处购买。也就是说,通过一些搜索,您可以免费查找和下载规范的草稿版本。我不确定它有多大帮助,因为SQL标准文档并非作为参考手册,而是一个正式的描述,并且深入细节,只与实现者有关。