SQL Server中Text、varchar(max)和varbinary(max)数据类型区别

我的未来我决定 提交于 2020-01-07 15:41:57

  以前只知道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 KEYNONCLUSTERED ( [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个字节的数据。

这几个数据类型在行为上和较小的数据类型 varcharnvarcharvarbinary 相同。

微软的说法是用这个数据类型来代替之前的textntextimage 数据类型,它们之间的对应关系为:

varchar(max)-------text;

nvarchar(max)-----ntext;

varbinary(max)----image.

 

有了大值数据类型之后,在对大值数据操作的时候要比以前灵活的多了。比如:之前text是不能用‘like’的,有了varchar(max)之后就没有这些问题了,因为varchar(max)在行为上和varchar(n)上相同,所以,可以用在varcahr的都可以用在varchar(max)上。

另外,这个还支持对插入的删除的表中的大值数据类型列引用上使用 AFTER 触发器。text就不行,总之,用了大值数据类型之后,我是“腰也不疼了,腿也不酸了,一口气也能上六楼了”。还等什么呢,快用大值类型吧。

 

SQL 2005中char、nchar、varchar、ntext and nvarchar(max)的区别

 对SQL 2005中char、nchar、varchar、ntext and nvarchar(max)的一些概念一直很模糊,最近搜集一些资料,汇总如下,以便以后复习:

 一、char 和varchar的区别和应用:

     1.char和varchar的区别:

varchar   有指定的最大长度,这种类型的数据长度可变,但在最大长度之内,如果一个string 比最大长度小,那么它将逐字存储而不多占额外的空间。 
char 是一个指定长度的类型的string,如果一个string 比设定的长度短,那么它将按照最长的长度来储存,超出string部分,填补空格。 
     2.char和varchar的应用:

当你的string没有固定长度的时候使用varchar(例如,姓名,城市,等等)。 
当你的string有固定长度的时候使用char(例如,电话号码,区号,等等)。 

二、前面带一个“n”的类型

      varchar/char前面带一个“n”的类型,意味着既可以存放unicode 编码的字符也可以存放非unicode编码的字符。没有“n”,则意味着只能存放unicode编码的字符。

      如果你的数据库里只有英文字符的话,那么使用nvarchar/nchar 或 varchar/char差别很小,如果处理不同国家的字符最好用nchar/nvarchar.

      什么是unicode编码?

            简单的说就是用两个字节表示一个字符,这是针对各国文字、符号进行统一性编码,unicode的主要用途是当你处理不同国家字符,比如日语或汉语。

 
 
 

  以前只知道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 KEYNONCLUSTERED ( [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个字节的数据。

这几个数据类型在行为上和较小的数据类型 varcharnvarcharvarbinary 相同。

微软的说法是用这个数据类型来代替之前的textntextimage 数据类型,它们之间的对应关系为:

varchar(max)-------text;

nvarchar(max)-----ntext;

varbinary(max)----image.

 

有了大值数据类型之后,在对大值数据操作的时候要比以前灵活的多了。比如:之前text是不能用‘like’的,有了varchar(max)之后就没有这些问题了,因为varchar(max)在行为上和varchar(n)上相同,所以,可以用在varcahr的都可以用在varchar(max)上。

另外,这个还支持对插入的删除的表中的大值数据类型列引用上使用 AFTER 触发器。text就不行,总之,用了大值数据类型之后,我是“腰也不疼了,腿也不酸了,一口气也能上六楼了”。还等什么呢,快用大值类型吧。

 

SQL 2005中char、nchar、varchar、ntext and nvarchar(max)的区别

 对SQL 2005中char、nchar、varchar、ntext and nvarchar(max)的一些概念一直很模糊,最近搜集一些资料,汇总如下,以便以后复习:

 一、char 和varchar的区别和应用:

     1.char和varchar的区别:

varchar   有指定的最大长度,这种类型的数据长度可变,但在最大长度之内,如果一个string 比最大长度小,那么它将逐字存储而不多占额外的空间。 
char 是一个指定长度的类型的string,如果一个string 比设定的长度短,那么它将按照最长的长度来储存,超出string部分,填补空格。 
     2.char和varchar的应用:

当你的string没有固定长度的时候使用varchar(例如,姓名,城市,等等)。 
当你的string有固定长度的时候使用char(例如,电话号码,区号,等等)。 

二、前面带一个“n”的类型

      varchar/char前面带一个“n”的类型,意味着既可以存放unicode 编码的字符也可以存放非unicode编码的字符。没有“n”,则意味着只能存放unicode编码的字符。

      如果你的数据库里只有英文字符的话,那么使用nvarchar/nchar 或 varchar/char差别很小,如果处理不同国家的字符最好用nchar/nvarchar.

      什么是unicode编码?

            简单的说就是用两个字节表示一个字符,这是针对各国文字、符号进行统一性编码,unicode的主要用途是当你处理不同国家字符,比如日语或汉语。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!