varchar(255)、varchar(256)、nvarchar(255)、nvarchar(256)、nvarchar(max) 等?
256 似乎是一个不错的、圆形的、节省空间的数字。但我见过 255 用了很多。为什么?
varchar 和 nvarchar 有什么区别?
varchar(255)、varchar(256)、nvarchar(255)、nvarchar(256)、nvarchar(max) 等?
256 似乎是一个不错的、圆形的、节省空间的数字。但我见过 255 用了很多。为什么?
varchar 和 nvarchar 有什么区别?
在 MS SQL Server(7.0 及更高版本)中,varchar 数据在内部最多用三个值表示:
重要的部分是两字节数据长度指示符。如果是一个字节,则只能正确记录长度为 0 到 255 的字符串;使用两个字节,您可以记录长度为 0 到超过 64000+(特别是 2^16 -1)的字符串。但是,SQL Server 页面长度为 8k,这就是 8000+ 字符限制的来源。(SQL 2005 中有数据溢出的东西,但如果你的字符串会那么长,你应该使用 varchar(max)。)
因此,无论您将 varchar 数据类型列声明为 (15, 127, 511) 多长时间,您实际上将为每一行存储的内容是:
这让我明白了:许多旧系统仅使用 1 个字节来存储字符串长度,这将您的最大长度限制为 255 个字符,这并不是那么长。使用 2 个字节,您就没有这样的任意限制......所以我建议选择一个对(假定非技术导向的)用户有意义的数字。,我喜欢 50、100、250、500,甚至 1000。考虑到 8000+ 字节的存储空间,255 或 256 与 200 或 250 一样有效,但在向最终用户解释事情时效率较低.
这适用于单字节数据(即 ansii、SQL_Latin1 * _ *General_CP1 等)。如果您必须使用不同的字母存储多个代码页或语言的数据,则需要使用 nvarchar 数据类型(我认为它的工作方式相同,两个字节表示字符数,但每个实际的数据字符需要两个字节存储)。如果您的字符串可能超过 8000,或者在 nvarchar 中超过 4000,您将需要使用 [n]varchar(max) 数据类型。
如果你想知道为什么用额外的字节占用空间来跟踪数据的长度如此重要,请查看http://www.joelonsoftware.com/articles/fog0000000319.html
菲利普
VARCHAR(255)。它不会使用所有 255 个字符的存储空间,只使用您需要的存储空间。它是 255 而不是 256,因为这样你就有 255 加上空终止符(或大小字节)的空间。
“N”代表 Unicode。如果您期望非 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 页面中,您可以在一个页面上存储任意数量的数据行。如果您UPDATE VARCHAR 列的值足够大以至于该行不再适合页面,则服务器将拆分该页面,移走一些记录。如果数据库没有可用页并且数据库设置为自动增长,则服务器将首先增长数据库以为其分配空白页,然后将空白页分配给表,最后将单个页一分为二。
如果您将支持英语以外的语言,您将需要使用 nvarchar。
HTML 应该没问题,只要它包含标准的 ASCII 字符。我主要在支持多语言的数据库中使用 nvarchar。
因为 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 文本
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% 更多字符的支持,以避免将来出现意外长数据的问题。
varchar(255) 也是 SQL Server 7.0 及更早版本中的最大长度。