在SQL中存储任意(可能标记为)文本的规范方法是什么?

时间:2020-03-06 14:22:50  来源:igfitidea点击:

Wiki / stackoverflow / etc是什么。存储文本时该怎么办?文字在换行符处被打断了吗?它会分成固定长度的块吗?我们如何最好地存储任意长的文本块?

解决方案

nvarchar(max)ftw。因为过度复杂简单的事情是不好的,嗯?

我想如果我们需要提供存储大块文本的功能,并且不介意在查询时不能过多地查看其内容,则可以使用CLobs。

所有这些都取决于我们正在使用的RDBMS以及要存储的文本类型。如果将文本格式化为相当大的数据块,这些数据块本身就具有某种含义,例如标题/正文,那么我们可能希望将数据分解为这些类型的列。根据我们要处理的内容,使用此方法可能需要多个表。

我不知道其他RDBMS如何处理它,但是我知道在每个表(文本或者varchar(max))中有多个不限成员名额的列不是一个好主意。因此,我们将要确保只有一列具有无限字符。

如果我们需要担心在文本中保留诸如格式化字符串,引号和其他"摘要"之类的内容(如代码可能那样),则需要先完全转义特殊字符,否则在提交数据库时,它们可能最终导致发出无效的命令。

大多数脚本语言都有内置的工具来完成此任务。

我怀疑StackOverflow将markdown格式的文本存储在任意大小的"文本"列中。也许是UTF8(但可能是UTF16之类的东西。我猜是SQL Server,我对此不太了解)。

通常,我们希望以"最少"形式将内容存储在数据库中。也就是说,进行所有解码,并可能进行清理,但不要对其进行任何其他处理(例如,如果是Markdown,请不要将其编码为HTML,而应保留其原始的"原始"格式)

我想这取决于我们要在哪里存储文本,如果我们需要事务等之类的东西。

像SQL Server这样的数据库具有可以存储长文本字段的类型。在SQL Server 2005中,对于长的Unicode文本字符串,这主要是nvarchar(max)。通过使用数据库,假设我们将数据库用于StackOverflow.com等其他用途,则可以从事务中受益,并且可以轻松进行备份/还原。

另一种方法是将文本存储在磁盘上的文件中。这可能非常容易实现,并且可以在数据库不可用或者过大的环境中工作。

关于存储在数据库或者文件中的文本格式,它可能与输入非常接近。如果是HTML,则只需将其通过可以正确转义的函数即可。

要记住的一点是,从创建到存储,我们可能想使用unicode或者UTF-8,反之亦然。这将允许我们支持其他语言。此编码机制的任何问题都会损坏文本。历史上,人们可能会基于节省磁盘空间等假设而默认使用ASCII。

对于SQL Server:

使用varchar(max)进行存储。我认为上限是2 GB。

不要试图自己转义文本。通过参数化结构传递文本,该结构将为我们正确进行转义。在.Net中,我们可以将参数添加到SqlCommand中,或者只使用LinqToSQL(然后由LinqToSQL为我们管理SqlCommand)。

关于PostgreSQL,请使用TEXT或者BYTEA类型。如果我们需要读取随机块,则可以考虑使用大对象。