0

每个人都喜欢提到 JDBC 如何抽象出 SQL 之间特定于供应商的差异,以呈现一种可以对抗大量 SQL 的单一 SQL 风格。

但是没有任何关于 JDBC 的书籍或参考资料提到过(详细的)规范,甚至没有提到(特定版本的)JDBC(比如 JDBC 4.1)支持的该 SQL 的体面的用户空间覆盖!

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

特定版本的 JDBC 所基于的 SQL 标准本身(2008、2003 等)是否免费提供?或者,我是否必须支付 $$ 才能获得副本?

4

2 回答 2

4

没有“JDBC SQL”,只有 ISO SQL 和它的供应商实现。JDBC 定义了与 SQL 数据库对话的接口,它与查询语言本身是不同的层。

JDBC 本身的参考是 JSR 文档:

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

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

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

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

请不要使用 w3schools SQL 指南,它们严重过时、错误,无法区分供应商扩展和标准,通常应避免使用。我之所以提到它们,是因为 w3schools 在搜索排名中的排名往往很高——早在过去它们实际上很有用的时候。

于 2013-06-28T03:46:49.893 回答
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 标准文档并非旨在作为参考手册,而是作为正式的描述,并且非常深入地介绍了仅与实施者相关的细节。

于 2013-06-27T10:47:38.377 回答