sql - 我应该如何将短文本字符串存储到 SQL Server 数据库中?

标签 sql sql-server database database-design

varchar(255)、varchar(256)、nvarchar(255)、nvarchar(256)、nvarchar(max) 等?

256 看起来是一个漂亮的、圆的、节省空间的数字。但我看到 255 使用了很多。为什么?

varchar 和 nvarchar 有什么区别?

最佳答案

在 MS SQL Server(7.0 及更高版本)中,varchar 数据在内部最多用三个值表示:

  • 实际的字符串,从 0 到超过 8000 字节(它基于页面大小、为行存储的其他列以及其他一些因素)
  • 两个字节用于指示数据字符串的长度(产生从 0 到 8000+ 的值)
  • 如果该列可为空,则该行的空位掩码中有一位(因此最多八个可为空的列的空状态可在一个字节中表示)

重要的部分是两个字节的数据长度指示符。如果是一个字节,只能正确记录长度为0到255的字符串;使用两个字节,您可以记录长度为 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 数据类型(我认为它的工作原理相同,两个字节用于字符数,但数据的每个实际字符需要两个存储字节)。如果您的字符串可能超过 8000 个,或者 nvarchar 中超过 4000 个,您将需要使用 [n]varchar(max) 数据类型。

如果您想知道为什么用额外的字节占用空间来跟踪数据的长度如此重要,请查看 http://www.joelonsoftware.com/articles/fog0000000319.html

菲利普

关于sql - 我应该如何将短文本字符串存储到 SQL Server 数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54512/

相关文章:

sql - SQL Server中如何去掉 '0'开头和结尾的字符

mysql - 在提交所有其他事务之前,PDO 事务是否会阻塞?

database - Order By Clause 在 SQL 中花费太多时间

sql - 为什么我的 sql server profiler 只显示空白模板

mysql - 临时表不返回 MySQL 存储过程中的结果集

sql - 如何将具有空格的变量从shell传输到oracle sqlplus

c# - SSIS使用脚本任务重命名目录中的文件

sql-server - 如何使用wireshark解码SQL Server流量?

SQL选择startdate是今天的日期

sql - 从 Postgres 中的 json 对象中删除双引号