我知道有关于此的辩论,尽管我可以找到一个真正明确的答案。
很多时候,这个问题导致定义varchar(MAX)等,它们的实际限制以及不使用的内容。
我想知道的是:
我正在为用户提供一个选项,可以无限制地在文本框中键入/粘贴任何他们想要的内容
这可以是从单词到图像的字节数组转储。
然后,我需要能够在稍后阶段使用其TITLE或ID快速引用此数据。
将这些数据存储到数据库中的最佳方法是什么?我已经读过使用varchar(MAX)停止索引,通常不应该使用。
我在SQL中并不是很富裕,所以我想可能的解决办法是将这个字符串拆分成4000个数组,然后将它们存储起来。
这是一个很好的领导?或者我错过了一些明显的东西?
一般模型:
public string a_Title { get; set; }
public string a_Content { get; set; }
public string a_AdditionalInfo { get; set; }
其中a_Content将存储为未知。
答案 0 :(得分:2)
我相信您现在不必担心您的存储类型。你真的可以选择varchar(n),varchar(max),nvarchar(n),nvarchar(max),甚至varbinary和text / ntext。所有这些都有其优点和缺点。您甚至可以使用FILESTREAM将类似blob的字符串放入文件中。
但是,我相信您希望通过某个int或short varchar字段引用您的数据,并且您希望得到相对较快的结果(而不是炽热的热门数据 - 昨天 - 快速)。可以有或多或少的最佳方式,但现在不考虑这一点。
我建议:
当你感到足够快乐的时候,创建一个性能测试机会,比如几千次访问。这是您第一次想要优化性能。在那之前,我甚至会忘记索引本身。
P.S。 - 不要将其拆分为4000字节的块;这是一个非常尴尬的解决方法,它可能导致随机搜索未命中(不完全随机,您可以在缓慢而痛苦的调试会话后找到错误)
答案 1 :(得分:1)
VarChar(MAX)
适用于像您这样的案件。
即使您将数据块化为NVarChar(4000)
(或VarChar(8000)
)字节段以允许构建索引,这些索引的确有什么价值呢?
你也要打开自己的头脑,找出段开始和结束的位置,然后在讨厌的SQL语句或某些中间层客户端代码中重构它们。
此外,VarChar(MAX)
和NVarChar(MAX)
会在可能的情况下保持在行内。这意味着在您分别使用4001
或8001
字符之前。
答案 2 :(得分:0)
一种方法是构建两个表,并利用VARCHAR(MAX)
:
CREATE TABLE table1 (ID INT PRIMARY KEY IDENTITY(1, 1), Name VARCHAR(1024) NOT NULL);
CREATE TABLE table1Text (ID INT PRIMARY KEY, data VARCHAR(MAX) NOT NULL);
ID
中的table1Text
是table1
的外键引用。这种方法的好处是您仍然可以索引table1
和,您可以在table1Text
上提供全文搜索,而不会遇到任何相互影响的问题。< / p>
答案 3 :(得分:0)
我很想使用varbinary(max)来表示你所描述的这个“catch-all”数据列。 varbinary数据类型可以存储文本(见下文),字节数组和整个文件。大小限制是2GB,但varbinary(与弃用的图像相反)的好处是你可以使用简单的子字符串函数返回/下载一部分数据。所以,如果你只想要一些数据的前100mb,你就用了:
Declare @data as varbinary(100000000)
select @data = substring(DataColumn,0,100000000) from SomeDataTable where ID = 1
要将文本插入varbinary,您可以使用:
declare @test table (
data varbinary(max) not null,
datatype varchar(10) not null
)
--insert varchar
insert into @test (data, datatype)
values cast('Your Text Here' as varbinary(max)), 'varchar'
-- insert nvarchar
insert into @test (data, datatype) select cast(N'YourTextHere' as varbinary(max)), 'nvarchar'
-- see the results
select data, datatype from @test
select cast(data as varchar(max)) as data_to_varchar, datatype from @test
select cast(data as nvarchar(max)) as data_to_nvarchar, datatype from @test