wikis/stackoverflow/等做什么。在存储文本时该怎么做?文本是否在换行符处断开?它被分成固定长度的块吗?你如何最好地存储任意长的文本块?
8 回答
nvarchar(max) ftw。因为把简单的事情复杂化是不好的,嗯?
我想如果你需要提供存储大块文本的能力,并且你不介意在查询时不能过多地查看它们的内容,你可以使用 CLobs。
这一切都取决于您使用的 RDBMS 以及您要存储的文本类型。如果文本被格式化成相当大的数据块,这些数据本身就意味着某些东西,比如标题/正文,那么您可能希望将数据分解为这些类型的列。根据您正在处理的内容,可能需要多个表才能使用此方法。
我不知道其他 RDBMS 是如何处理它的,但我知道在每个表中拥有多个开放式列(文本或 varchar(max))并不是一个好主意。因此,您需要确保只有一列具有无限字符。
Regarding PostgreSQL - use type TEXT or BYTEA. If you need to read random chunks you may consider large objects.
如果您需要担心在文本中保留诸如格式化字符串、引号和其他“杂乱无章”之类的内容,就像代码可能那样,那么特殊字符需要首先完全转义 - 否则在提交数据库时,它们可能会结束导致发出无效命令。
大多数脚本语言都有本机内置的工具来执行此操作。
我怀疑 StackOverflow 在任意大小的“文本”列中以降价格式存储文本。也许是 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。
Don't try to escape the text yourself. Pass the text through a parameterizing structure that will do the escapes properly for you. In .Net you'd add a parameter to a SqlCommand, or just use LinqToSQL (which then manages the SqlCommand for you).