2010-11-09 60 views
2

所以......发生时我正在研究一些代码,这些代码最终将同时在不同的sql服务器上使用。SQL兼容性图表(特别是数据类型)

虽然SQL代码因服务器而不同,但数据类型和列不同。

因此,我需要知道哪些是(至少大部分)sql服务器类型通用的数据类型。

作为一个起点,我有以下几种类型:

byte, char, float, int, text, varchar, blob 

请注意,拼写是很重要的,因为数据类型名称将在查询结束,因为是(例如:虽然两者int和整数支持,我需要普通的)。

所以,问题是,有没有人知道一个图表比较SQL服务器之间的兼容性?或者也许是在该领域做过一些研究的人?

就偏差而言,我明显偏向于特定的RDBMS,所以不需要RDBMS更好的答案。让我们继续关注这个话题,好吗?

回答

0

我会研究SQL ANSI标准规范并使用其中指定的数据类型。一本书like this可能会帮助你。

他们都有很好的文档,所以我只会阅读他们的数据类型。可能会有你需要的所有信息。我之前可以找到的only other informationpretty old

希望有所帮助。

编辑:只是另一个想法......你可以使用你的SQL的战略模式,这样它就不会有问题,如果它不同,你可以使用更高级的功能。尽管如此,你还有更多的工作要做,还有更多需要维护:/

+0

谢谢,非常有用的信息。关于“战略模式”,我不确定我是否跟随你。如在,它对我有什么用处?正如在中,我已经遵循了这种模式,但是某些数据类型可能对某些RDBMS(例如“blob”)是排他性的。 – Christian 2010-11-09 11:08:31

+0

我虽然你可能能够'插入'不同的类,以允许不同的功能,例如,如果 – 2010-11-09 11:25:12

+0

对不起,输入按钮不工作添加评论...认为你可能能够使用它来转换不同的返回数据类型,或根据您插入到dao类的类运行不同的SQL ...请参阅http://www.dofactory.com/Patterns/PatternStrategy.aspx是否有意义?也许那不是你想要达到的目标? – 2010-11-09 11:26:57

1

我想你最终会为每种类型的数据库服务器编写特定的CASY大小写的SQL语句。当然,我做到了。

我一直在你的情况,包括有意编写数据库不可知的代码,但从长远来看,它不工作。例如,一个数据库不会处理多字节字符串,而另一个数据库会要求它们(例如SQL Server CE),这会迫使您在列上使用Varchar vs NVarchar。一些数据库将支持多字节字符串,但性能糟糕。一个将使用VARCHAR2(Oracle),其他人将使用VARCHAR。一个人会以一种方式处理BLOB,而另一个人会以不同方式处理BLOB。不要让我开始使用日期数据类型。

与其查找可在所有数据库中工作的SQL语言和数据类型的神奇子集,您会更明智地寻找可以隐藏您的差异的数据访问方法/库(可能是一些ORM库你创建数据库对象以及访问它们?)

就像我说过的,我一直都(并且仍然)在您不得不支持多个数据库的情况下,对我来说最好的解决方案是为每个数据库编写最佳代码,而不是试图找到SQL数据类型和在所有这些数据类型中工作的代码(我无法达到满意的程度)。

另外,如果您为每个数据库创建单独的SQL文本,您将能够从每个数据库中挤出更多性能(即,在创建完全不适用的Oracle表时,您可以指定的与性能相关的参数在任何其他数据库中创建一个表)。

我说,不要在不同的数据库中争取语法差异,你不会赢。尽可能容忍和利用这些差异来获得优势是一个更好的主意。

+0

其实,我是编写ORM库的人;) – Christian 2010-11-09 13:59:13

+0

无论如何,这个问题(正如我上面所说的)是数据类型。 SQL语句根据库进行预处理。我只需要知道核心数据类型。另外,因为它是通过sql语句传递的,所以我不能被多字节打扰(它总是和我传递的字符串一样)。 – Christian 2010-11-09 14:00:43

+0

@Christian,如果你是写ORM的人,那么你应该完成繁重的工作。找出自己哪种类型最好。您正在试图通过查找可以给出所有答案的图表来削减一个角落。我的观点是,并不那么简单。我关于多字节的观点并不是你是否需要它,而是关于它是否支持目标数据库。 – 2010-11-09 14:04:36