为了我自己的乐趣,我正在尝试编写一个SQL脚本来构建一个尽可能跨RDBMS的数据库。它只是创建数据库,它的表,并可能用一些数据填充它。
一个表存在编码问题,我想知道用于描述问题的数据类型。如果我使用MySQL,我只会使用TEXT类型,但我发现这在(ANSI)标准SQL中不可用。
是否存在可用于任意大型文本数据的数据类型,这些数据将是标准SQL并与Postgres / MySQL / MSSQL兼容?或者我只需要使用非常大的VARCHAR并希望它足够大?
答案 0 :(得分:4)
标准SQL提供了CLOB(字符大对象)类型,用于保存非常大的文本对象。但是,对于使用此类对象可以执行的操作存在限制,并且您的DBMS可能不支持该类型。还有BLOB(二进制大对象)类型。
在主DBMS已经拥有自己的非标准设施之后,大型字段被标准化,因此不同系统之间的一致性没有您想要的那么多。您需要定义感兴趣的系统,或者接受当您移动到不同的DBMS(或者很可能是两者)时,您选择的任何内容都需要更改。您感兴趣的系统之间可能存在共同的子集,但相对不太可能。
答案 1 :(得分:2)
实际上,您需要决定:您希望实现什么:ANSI兼容的数据类型定义或定义与尽可能多的DMBS兼容。而这两件事并不相同。无论标准中写了什么 - 它都是 DBMS ,它们或多或少都在维护这些标准。所以这就是为什么在实际意义上盲目遵循标准没什么意义,但遵循某些DBMS的规范是有用的。
我不是说标准都是垃圾,你不应该看那里。一般来说,所有DBMS都遵循它们 - 所以如果你的方案也会遵循它们 - 很有可能大多数DBMS支持这种方案,但是不能保证。
例如,MySQL的变量字符串长度为TEXT
(中等长度,最高为64Kb),Postgres的数据类型也为TEXT
。 MSSQL也是如此 - 它还具有TEXT
数据类型支持。所以你可以将它用于所有3个DBMS - 但每个DBMS都有它自己的这种数据类型的实现(例如,在SQL Server中它的大小高达2Gb - 所以,正如你所看到的那样,太大的数据将被成功处理MSSQL 2Gb长度的TEXT将在MySQL中失败)。这意味着 - 在正式意义上,您的架构将适用于所有这3个DBMS,但实际上可能存在问题,因为每个DBMS对该类型都有不同的规则。