Understanding VARCHAR(MAX) in SQL Server 2005
In SQL Server 2000 and SQL
Server 7, a row cannot exceed 8000 bytes in size. This means that a VARBINARY
column can only store 8000 bytes (assuming it is the only column in a
table), a VARCHAR column can store up to 8000 characters and an NVARCHAR
column can store up to 4000 characters (2 bytes per unicode character).
This limitation stems from the 8 KB internal page size SQL Server uses
to save data to disk.
To store more data in a single column, you
needed to use the TEXT, NTEXT, or IMAGE data types (BLOBs) which are
stored in a collection of 8 KB data pages that are separate from the
data pages that store the other data in the same table. These data pages
are arranged in a B-tree structure. BLOBs are hard to work with and
manipulate. They cannot be used as variables in a procedure or a
function and they cannot be used inside string functions such as
REPLACE, CHARINDEX or SUBSTRING. In most cases, you have to use READTEXT,
WRITETEXT, and UPDATETEXT commands to manipulate BLOBs.
To solve this problem, Microsoft introduced the VARCHAR(MAX), NVARCHAR(MAX),
and VARBINARY(MAX) data types in SQL Server 2005. These data types can
hold the same amount of data BLOBs can hold (2 GB) and they are stored
in the same type of data pages used for other data types. When data in a
MAX data type exceeds 8 KB, an over-flow page is used. SQL Server 2005
automatically assigns an over-flow indicator to the page and knows how
to manipulate data rows the same way it manipulates other data types.
You can declare variables of MAX data types inside a stored procedure or
function and even pass them as variables. You can also use them inside
string functions.
Microsoft recommend using MAX data types instead of BLOBs in SQL
Server 2005. In fact, BLOBs are being deprecated in future releases of
SQL Server.
|