2013-06-27 27 views
0

大家都喜欢提及JDBC如何提取SQL之间供应商特定的差异,以呈现一种可以抵御整个SQL的单一SQL风格。 (JDBC 4.1)支持的SQL(指定版本)所支持的SQL的任何(详细)规范或甚至体面的用户空间范围都没有提及!因此,最终发生的事情(至少在我看来)是,如果我使用MySQL,我必须参考MySQL参考手册,然后尝试防止意外使用MySQL特有的功能。对于编写可移植的SQL(至少在我使用的JDBC驱动程序版本支持的级别),我宁愿直接引用JDBC规范或SQL规范,而不是引用MySQL,PostgresQL等。JDBC SQL:详细规范在哪里?

SQL标准本身(2008,2003等),JDBC的特定版本是基于哪个版本免费提供的?或者,我是否需要花费$ $$才能获得副本?

回答

4

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

用于JDBC的参考自身就是JSR文档:

遗憾的是官方的SQL标准是昂贵的,并且必须从ISO购买。

你可以找到后期的草稿,这些草稿当你不想在其他地方开发一个合适的实现here时非常有用。

SQL规范不是最友好和可读性的东西,所以在实践中这是一个好主意,用这实际上是要由人来阅读供应商文档。您可以比较几个供应商文档,或在出现不确定性时回退标准文档。

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

请不要使用w3schools SQL指南,它们严重过时,错误,无法区分供应商扩展和标准,通常应该避免。我提到他们是因为w3学校在搜索排名中往往会出现相当高的排名 - 在他们过去真正有用的那一天回来。

+0

您的wiscorp链接应该证明非常有用。我发现它非常令人压抑**整体上DBMS层的事务状态:SQL可能是用于特定数据查询和操作的强大工具。但仅仅因为它不可移植,并且在涉及关系模型时并没有走到最后一英里,我们中的很多人(不包括OO粉丝)发现自己不得不处理ORM。我以某种方式憎恨ORM,因为在我的直觉中,集合将是更强大的方法来模拟实体和关系。 – Harry

+1

@Harry SQL的一大问题在于它是一种专门用手写的ad-hoc语法的语言,但现在它主要是由机器编写的。对于查询语言,我们应该使用不同的语法,而不需要复杂的通用语法分析器,比如嵌套的yaml/json,嵌套的S表达式等。除了在数据库中获取传递关系以避免那些可怕的左连接链和重复数据删除之外,只需使用新的语法和稍微扩展的关系模型就可以做出更好的事情。 –

+1

@Harry这不会对整个one-db-supports-one-thing,other-db-supports-other-thing问题有所帮助,但这是* any *标准的问题,而更强大的标准具有更多的差异。 PostgreSQL的嵌套JSON格式取回结果的能力已经在帮助解决这个问题。 –

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标准文档不是作为参考手册的,而是一个形式化的描述,并且只涉及与实施者相关的细节。

+0

这很不幸。处理SQL时不会有一个问题。谢谢。 – Harry