ANSI标准SQL中是否有一种数据类型可以容纳任意长度的字符串?

4
为了自己的兴趣,我正在尝试编写一个SQL脚本,以建立尽可能与各种RDBMS兼容的数据库。它将只创建数据库,其表格,并可能用一些数据填充它。
其中一张表格包含编码问题,我想知道在问题描述中使用什么数据类型。如果我使用MySQL,我会直接使用TEXT类型,但我发现这在(ANSI)标准SQL中不可用。
是否有一种数据类型适用于任意大的文本数据,它是标准SQL并与Postgres / MySQL / MSSQL兼容?还是我只能使用一个非常大的VARCHAR并希望它足够大?

1
MySQL没有NTEXT,只有TEXT。 - Barmar
Postgres 也有 TEXT 数据类型。 - nzifnab
很遗憾,TEXT和NTEXT似乎不是ANSI标准的一部分。我刚刚更新了我的问题,指定它应该尽可能符合ANSI标准。哪个ANSI标准取决于哪个能更好地与最流行的RDBMS兼容。 - labyrinth
1
该数据类型的 ANSI 标准是 CLOB - user330315
2个回答

4
标准SQL提供了CLOB(字符大对象)类型来存储真正大的文本对象。然而,这些对象的使用有其限制,也许您的DBMS不支持该类型。此外,还有BLOB(二进制大对象)类型。
在主要的DBMS已经拥有它们自己的非标准设施之后,大型字段被标准化了,因此不同系统之间的连贯性并不像您希望的那样高。您需要定义感兴趣的系统,或者接受无论您选择什么都需要在切换到不同的DBMS时进行更改(或者两者都需要)。可能存在您感兴趣的系统之间的共同子集,但这种情况相对较少。

我会选择将这个标记为绿色,因为它直接回答了我的问题:“是的,有--CLOB和BLOB。”其他信息也很有用。 - labyrinth

2
实际上,你需要决定:你想要实现什么目标:与 ANSI 兼容的数据类型定义还是尽可能兼容多数 DMBS 的定义。这两件事情并不相同。无论标准中写了什么 - 它是由 DBMS 来维护这些标准 - 多多少少都是如此。因此,在实际意义上,盲目遵循标准没有太大意义,但遵循某个特定 DBMS 的规范是有用的。
我并不是说标准都是废物,你不应该去看它们。总的来说,所有的 DBMS 都在遵循它们 - 因此,如果你的方案也遵循它们 - 这样的方案有很大的机会被大多数 DBMS 支持,但这并不是保证
例如,MySQL有TEXT用于可变字符串长度(中等长度,最多64Kb),Postgres也有TEXT数据类型。MSSQL也有TEXT数据类型支持。因此,您可以在这三个DBMS中使用它,但每个DBMS都有自己的实现方式(例如,在SQL Server中,它的大小为2Gb - 因此,正如您所看到的,MSSQL 2Gb长度的TEXT可以成功处理过大的数据,而在MySQL中会失败)。这意味着,在正式意义上,您的模式将在这3个DBMS中工作,但在实践中可能会存在问题,因为每个DBMS对该类型具有不同的规则。

1
如果我没记错的话,在SQL Server中text已经被弃用了(推荐使用varchar(max))。而在MySQL中,text只能容纳64k的数据,如果需要存储4GB的数据,则需要使用LONGTEXT - user330315
是的,混淆了“TEXT”和“LONGTEXT”,你说得对。我没有找到关于SQL Server(我指过时的“TEXT”数据类型)的证据,但如果我错了,我很乐意改进我的帖子。我是指证明关键字“TEXT”本身将不可用。 - Alma Do
从[SQL Server手册](http://msdn.microsoft.com/en-US/library/ms187993%28v = sql.90%29.aspx)中得知:“避免在新的开发工作中使用这些[ntext,text和image]数据类型,并计划修改目前正在使用它们的应用程序 - user330315
是的,我已经注意到了(因为在帖子中链接了它)- 这严格意义上意味着关键字本身也将被删除吗?(并且不会有向后兼容性)? - Alma Do
我点赞了这篇文章,因为它给了我一些有用的信息,让我注意同名类型的不同大小和规则。我的目标是符合 ANSI 标准,同时做出一些妥协以支持一些主要的 DBMS。我的优先级是 Postgres、Oracle、MySQL 和 MSSQL,按照这个顺序。然而,这并不是我的原始问题,我认为你的信息通常对这个问题很有用。 - labyrinth
另一个具有TEXT数据类型的DBMS是Informix(它还具有CLOB、BYTE和BLOB类型)。用于支持TEXT(和BYTE)的客户端数据结构是神秘的,并且与任何其他DBMS使用的类型完全不同(但这些是预标准实现)。通过不透明类型和复杂的API访问BLOB和CLOB类型。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接