在SQL Server 2008中存储故事?

4

我将在SQL Server的nvarchar(MAX)字段中存储故事,但我知道这些故事会比MAX允许的长度要长得多,那么我应该采取什么方法呢?是否应该将故事分成多行或者跳过使用数据库而使用文本文件呢?


6
我认为这些故事不可能比 nvarchar(max) 允许的字符数量更多,那是10亿个字符。《战争与和平》只有56万个单词。 - Martin Smith
1
@Xaisoft - 不是最大的非“MAX”值是8000。如果您指定“nvarchar(max)”,它允许高达2GB的大小。 - Martin Smith
1
NVARCHAR解释:http://msdn.microsoft.com/zh-cn/library/ms186939.aspx - Tim Lehner
4
@TomTom - 没有必要这么粗鲁。OP很显然对此感到困惑。 - JNK
1
@JNK和我认为这很令人困惑。他们应该将varchar(max)作为单独的数据类型或者允许传递高达10亿的值作为n。或者使用一个不同于“max”的单词。 - D'Arcy Rittich
显示剩余17条评论
4个回答

7
我相信这里的混淆源于对术语的误解。 nvarchar(n)是一种数据类型,其中n可以是1-4000的数字。在这种情况下,数字n最大为4000,这相当于8000个字节(每个字符2个字节)。 nvarchar(MAX)则完全是不同的数据类型——关键词MAX是一个文字,它并不是我上面例子中n的任何潜在值的同义词。这种类型的字段最大长度为2^31-1个字符,超过10亿个字符,相当于超过20亿个字节(每个字符2个字节)。
对于varchar(n)varchar(MAX)也适用同样的原则,只是每个字符可能只有1个字节,这样可以存储的字符数量加倍。是否只有1个字节取决于排序规则,正如Martin Smith在评论中指出的!

1
谢谢你理解我的困惑。 - Xaisoft
@Xaisoft 非常欢迎。他们选择这种命名方案作为该数据类型,实际上更与已弃用的 NTEXT 相关,而不是 nvarchar(n)。并且进一步使用关键字 MAX 似乎会导致人们认为 MAX 是一个同义词,意思是“在此处使用最大数值”。 - Andrew Barber
1
+1 但是有一点小问题。varchar 并不总是一个字符等于一个字节。这取决于排序规则。请参考 - Martin Smith
1
@AndrewBarber 是的,但考虑到仍然存在着旧版文档并且它们指定了那些值为最大值,这并不奇怪。 - Jon Hanna
@JonHanna 哎呀,即使你浏览了当前的文档(如果你只是在寻找“这个的最大值是多少?”那么谁会比浏览更多呢?),我也能理解为什么MAX似乎是某种同义词。我认为他们最好坚持使用一个完全独立的名称来替换NTEXT/TEXT的功能。但是,这可能会违反SQL标准...(我现在在笑...) - Andrew Barber
显示剩余4条评论

4

把它们存储在章节中。

这并不是技术问题 - 拥有10亿个nvarchar字符的故事几乎是不可能的(而nvarchar(max)是“新”的TEXT数据类型)。

但是,加载和处理它们将会很痛苦。

将它们存储为章节,并在有意义的时候为每个章节存储起始/结束页码,以便您可以更轻松地导航。

顺便说一句,您发布了您认为它是800个字符 - 这从来没有发生过。如果适用,限制将为8000字节 - 并且那将是4000个字符的Unicode。


+1 因为如果这些故事是多章节的故事,这可能是非常好的额外建议。 - Andrew Barber
如果它们不是,它们也不会非常大;) - TomTom
1
次要相关信息:根据维基百科的资料,用英语写成的最长单卷小说是《可怜的同胞》,共有85万字。而根据这份文档显示,英语单词的平均长度为5.10个字母。 - Andrew Barber
1
相比于nvarchar的存储可能性,这使它变得微不足道 - 但那只是一个小说。我相信我可以想出更长的文本 ;) - TomTom

2

1
总是很好奇地切换技术,仅仅因为你甚至不知道你当前正在使用的技术可以做到什么。我并不怀疑它是好是坏,但发帖者仅仅是因为他有错误的信息,认为技术限制是8000个字符(这从来就不是)。 - TomTom
@TomTom 这个回答不应该被评为-1。原帖提出了问题,Moose 提供了一个可能的解决方案。这并不是一个坏的解决方案(特别是考虑到在 OP 被误导之前就发布了)。不要因为它不是你会选择的解决方案而对它进行 -1 评价。 - ean5533
@TomTom。在我发帖时,并没有提示原始发布者认为限制是8000个字符。话虽如此,如果原始发布者不知道存在可替代的选项,这仍然是一个有效的观点来说明。我并不建议他放弃已有的内容,我只是建议他调查一下。 - Mr Moose
在您发布帖子的时候,应该清楚地知道限制是如此之高,以至于没有任何“故事”能够达到它。 - TomTom
@MrMoose - 我很感激你提供的另一种方法,尽管我可能有些误导。 - Xaisoft
显示剩余3条评论

-3

好的,你可以尝试使用LONGTEXT(Mysql)或TEXT(MSSQL)进行存储(如果你想要存储对象,我认为你可以使用BLOB)数据类型?


这个被标记为 sql-server,所以 LONGTEXT 不适用。自 SQL 2005 起,TEXT 已被弃用。nvarchar(MAX) 是正确的数据类型。 - Andrew Barber
虽然我从不使用BLOB……但如果我要存储图像,我会将它们存储在服务器上,并在数据库中引用它们,因为这样可以节省大量的数据库空间。 - Andi Lee Davis
-1. 文本已被弃用,现在应使用nvarchar(max)。实际上,Text是对它的别名。 - TomTom
1
我听说Text将被弃用。 - Xaisoft

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