SQL Server中Text和varchar(max)數據類型區別
以前只知道text和image是可能被SQL Server淘汰的數據類型,但具體原因不太清楚,今天讀書的時候發現了text與varchar(max)和nvarchar(max)的區別,主要是對操作符的限制,text只能被下列函數作用:
| 函數 | 語句 |
|---|---|
| DATALENGTH |
READTEXT |
| PATINDEX |
SET TEXTSIZE |
| SUBSTRING |
UPDATETEXT |
| TEXTPTR |
WRITETEXT |
| TEXTVALID |
舉個列子,如果“文本”這一列的數據類型為text,那么它將不能用於“=”“left()”等操作,比如下面的例子:
建立表,填充數據:
if exists (select * from sysobjects where id = OBJECT_ID('[asdf]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [asdf]
CREATE TABLE [asdf] (
[inttest] [int] IDENTITY (1, 1) NOT NULL ,
[text] [text] NULL ,
[varcharmax] varchar(max) NULL )
ALTER TABLE [asdf] WITH NOCHECK ADD CONSTRAINT [PK_asdf] PRIMARY KEY NONCLUSTERED ( [inttest] )
SET IDENTITY_INSERT [asdf] ON
INSERT [asdf] ( [inttest] , [text] , [varcharmax] ) VALUES ( 1 , '1111111' , '1111111' )
SET IDENTITY_INSERT [asdf] OFF
運行查詢:
查詢一:
SELECT [text]
,[varcharmax]
FROM [testDB].[dbo].[asdf]
where
[text] ='11111' AND
[varcharmax] = '1111111'
會出現以下錯誤提示:
消息402,級別16,狀態1,第1 行
數據類型text 和varchar 在equal to 運算符中不兼容。
查詢二:
SELECT [text]
,[varcharmax]
FROM [testDB].[dbo].[asdf]
where
[varcharmax] = '1111111'
可以成功運行
在MS SQL2005及以上的版本中,加入大值數據類型(varchar(max)、nvarchar(max)、varbinary(max) )。大值數據類型最多可以存儲2^30-1個字節的數據。
這幾個數據類型在行為上和較小的數據類型 varchar、nvarchar 和 varbinary 相同。
微軟的說法是用這個數據類型來代替之前的text、ntext 和 image 數據類型,它們之間的對應關系為:
varchar(max)-------text;
nvarchar(max)-----ntext;
varbinary(max)----image.
有了大值數據類型之后,在對大值數據操作的時候要比以前靈活的多了。比如:之前text是不能用‘like’的,有了varchar(max)之后就沒有這些問題了,因為varchar(max)在行為上和varchar(n)上相同,所以,可以用在varcahr的都可以用在varchar(max)上。
另外,這個還支持對插入的和刪除的表中的大值數據類型列引用上使用 AFTER 觸發器。text就不行,總之,用了大值數據類型之后,我是“腰也不疼了,腿也不酸了,一口氣也能上六樓了”。還等什么呢,快用大值類型吧。
