如何将短文本字符串存储到SQL Server数据库中?
varchar(255),varchar(256),nvarchar(255),nvarchar(256),nvarchar(max)等?
256似乎是一个不错的,舍弃空间的数字。但是我已经看到255用了很多。为什么?
varchar和nvarchar有什么区别?
解决方案
回答
如果我们要支持英语以外的其他语言,则需要使用nvarchar。
HTML应该可以,只要它包含标准ASCII字符即可。我主要在多语言支持的数据库中使用过nvarchar。
回答
VARCHAR(255)。它不会使用全部255个字符的存储空间,而只会使用我们需要的存储空间。它是255,而不是256,因为这样我们就有了255的空间以及null终止符(或者大小字节)。
" N"用于Unicode。如果我们期望使用非ASCII字符,请使用。
回答
IIRC,255是MySQL中varchar的最大大小,在我们不得不切换到文本数据类型之前,或者在某个时候(实际上,我认为现在更高)。因此,将其保持为255可能会为我们带来一些兼容性。不过,我们需要先对其进行查找。
varchar vs nvarchar有点像ascii vs unicode。 varchar每个字符限制为一个字节,nvarchar可以使用两个字节。这就是为什么我们可以拥有varchar(8000)但只有nvarchar(4000)的原因
回答
varchar和nvarchar都将自动调整大小以适应内容,但是在声明列类型时定义的数字是最大的。
" nvarchar"中的值是" varchar"的两倍,占用磁盘/内存空间,因为unicode是两个字节,但是声明列类型时,我们声明的是字符数,而不是字节。
因此,当我们定义列类型时,应确定该列将需要保留的最大字符数,并将其作为varchar(或者nvarchar)大小。
一个好的经验法则是估计该列需要保持的最大字符串长度,然后为其增加大约10%的字符支持,以避免将来出现意外的长数据问题。
回答
由于1字节中有8位,因此1字节中可以存储256个不同的值,即
0 1 2 3 4 5 ... 255
请注意,第一个数字是0,所以总共有256个数字。
因此,如果我们使用nvarchar(255),它将使用1个字节来存储字符串的长度,但是,如果我们将值翻1并使用nvarchar(256),那么我们将浪费另外1个字节,这是因为255(因为我们需要2个字节来存储数字256)。
那可能不是SQL Server的实际实现,但我认为这是将事物限制在255个以上256个项目的典型原因。
nvarchar用于Unicode,每个字符使用2个以上字节,
varchar用于仅使用1个字节的普通ASCII文本
回答
定义char / varchar和N个变体时,还需要考虑其他几点。
首先,将可变长度字符串存储在数据库中会产生一些开销。一个好的通用经验法则是对少于10个字符的字符串使用CHAR,因为N / VARCHAR既存储字符串又存储字符串的长度,并且在N / CHAR和N / VARCHAR小于10的字符串之间存储短字符串的区别不大值得字符串长度的开销。
其次,SQL Server中的表存储在8KB页上,因此数据行的最大大小为8060字节(其他192用于SQL的开销)。这就是为什么SQL允许最大定义的列为VARCHAR(8000)和NVARCHAR(4000)的原因。现在,我们可以使用VARCHAR(MAX)和unicode版本。但是可能会有与此相关的额外开销。
如果我没记错的话,SQL Server将尝试将数据与该行的其余部分存储在同一页上,但是,如果我们尝试将太多数据放入VARCHAR(Max)列中,它将被视为二进制和将其存储在另一页上。
CHAR和VARCHAR之间的另一个大区别与页面拆分有关。鉴于SQL Server将数据存储在8KB页面中,因此我们可以在页面上存储任意数量的数据行。如果我们更新的VARCHAR列的值足够大,以致该行不再适合该页面,则服务器将拆分该页面,移走一些记录。如果数据库没有可用页面,并且数据库设置为自动增长,则服务器将首先增长数据库以为其分配空白页面,然后将空白页面分配给表,最后将单个页面分成两部分。
回答
varchar(255)也是SQL Server 7.0及更早版本中的最大长度。
回答
在MS SQL Server(7.0及更高版本)中,varchar数据在内部使用最多三个值表示:
- 实际的字符串,从0到超过8000个字节(取决于页面大小,为该行存储的其他列以及其他一些因素)
- 两个字节,用于指示数据字符串的长度(产生的值介于0到8000+之间)
- 如果该列是可空的,则行中的一位为空位掩码(因此,一个字节中最多可表示八个可空列的空状态)
重要的部分是两个字节的数据长度指示符。如果是一个字节,则只能正确记录长度为0到255的字符串;否则为0。使用两个字节,我们可以将长度为0的字符串记录到超过64000+(特别是2 ^ 16 -1)的字符串中。但是,SQL Server页面长度为8k,这是8000个以上字符限制的来源。 (SQL 2005中存在数据溢出问题,但是如果字符串要那么长,则应该使用varchar(max)。)
因此,无论我们将varchar数据类型列声明为(15,127,511)多长时间,实际上每一行要存储的内容是:
- 2个字节来指示字符串有多长
- 实际的字符串,即该字符串中的字符数
这使我明白了:许多较旧的系统仅使用1个字节来存储字符串长度,这将我们限制为最大255个字符的长度,这并不是那么长。使用2个字节时,我们没有这样的任意限制...因此,我建议选择一个对于(假定为非技术方向)用户有意义的数字。 ,我喜欢50、100、250、500,甚至1000。鉴于8000+字节的存储基数,255或者256的效率与200或者250一样,而在向最终用户解释情况时效率较低。 。
这适用于单字节数据(即ansii,SQL_Latin1 * _ * General_CP1等)。如果我们必须使用不同的字母存储多个代码页或者语言的数据,则需要使用nvarchar数据类型(我认为这是相同的,charactesr的数量为两个字节,但是数据的每个实际字符都需要两个字节的贮存)。如果字符串在nvarchar中可能超过8000,或者超过4000,则需要使用[n] varchar(max)数据类型。
而且,如果我们想知道为什么仅用多余的字节来占用空间以跟踪数据有多么重要,请查看http://www.joelonsoftware.com/articles/fog0000000319.html
菲利普