我想在数据库中创建一个文本字段,没有特定的大小(在某些情况下它会存储长度未知的文本) - 特定的文本是序列化的简单对象(~JSON)
最独立于数据库的方法是什么: - 没有指定大小的varchar(不要认为所有db都支持这个) - 一个'文本'字段,这似乎很常见,但我不相信它是一个标准 - 那种斑点或其他物体? - 一个非常大的varchar(效率低,可能浪费磁盘空间) - 其他?
我正在使用JDBC,但我想使用大多数数据库支持的东西(oracle,mysql,postgresql,derby,HSQL,H2等......)
感谢。
答案 0 :(得分:3)
你真的需要支持这六个数据库吗? (提示:不。)
我认为编写普遍可移植的SQL DDL并不值得。 YAGNI。
您应该支持当前使用的数据库,并准备好适应您将来采用的数据库。
重新评论:唯一标准的SQL可变长度数据类型是VARCHAR
和BLOB
。 VARCHAR
用于字符串数据,其声明包括字符集和排序规则。 BLOB
用于二进制数据,不支持字符集/整理。
其他数据类型(例如VARCHAR(max)
,CLOB
或TEXT
)是供应商扩展程序:
VARCHAR(max)
:MS SQL Server NVARCHAR(max)
:MS SQL Server LONGVARCHAR
:Derby,H2,HSQLDB CLOB
:Derby,H2,HSQLDB,Oracle,SQLite NCLOB
:Oracle TEXT
:MS SQL Server,MySQL,PostgreSQL,SQLite NTEXT
:MS SQL Server 答案 1 :(得分:3)
一个非常大的varchar(效率低,可能浪费磁盘空间)
这将是最便携的选择。将自己限制为2000个字符,对大多数数据库你应该没问题(oracle是当前的2000限制器,但也要警惕旧的 mysql版本)。我也不会太担心磁盘空间。大多数数据库仅将磁盘用于现场保存的实际数据。
答案 2 :(得分:1)
使用BLOB。 JDBC2.0 API支持它,因此任何支持JDBC2.0(J2SE 5.0)的驱动程序都应该支持它
BLOB的优点是:
1.规模可以大到4G-1(甲骨文。其他数据库不太确定)
2.可以存储您想要的任何数据(甚至图像序列化到您的JSON结构中的某个字段)
3.完全中立以跨OS运输
4.您仍然可以利用引用BLOB的键上的索引,以便搜索ids等,不必通过获取结构来完成。
答案 3 :(得分:0)
使用像hibernate这样的框架,因此找不到通用解决方案就没有问题了。我不认为你可以在每个提到的数据库中使用一种通用类型。我想,数据库差异很大。
答案 4 :(得分:0)
text is perhaps best但是很快就会从SQL Server中删除,而所有所列的没有 DBMS独立选项。
当谈到SQL时,可移植性被高估了。在更改DBMS之前,您更有可能更改客户端代码。选择一个并继续......