对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的主要用途是当你处理不同国家字符,比如日语或汉语。
三、一个例子:
Create Database test_DB
use test_DB
drop table T
--CHAR,VARCHAR,NVARCHAR,NTEXT,NVARCHAR MAX
--difference VARCHAR <-> NVARCHAR : N is for unicode and needs 2 bytes for a character
create table [ dbo ].[ T ](
[ ID ] [ bigint ] IDENTITY ( 1 , 1 ) NOT NULL,
[ V_CHAR ] [ char ]( 10 ) NULL,
[ V_VARCHAR ] [ nvarchar ]( 4001 ) NULL,
[ V_TEXT ] [ ntext ] NULL,
[ V_VARCHARMAX ] [ nvarchar ]( max ) NULL
)
-- not allowed :
-- a char can only hold up to 8000 char
-- a nvarchar can only hold up to 4000 char
create table [ dbo ].[ T ](
[ ID ] [ bigint ] IDENTITY ( 1 , 1 ) NOT NULL,
[ V_CHAR ] [ char ]( 10 ) NULL,
[ V_VARCHAR ] [ nvarchar ]( 4000 ) NULL,
[ V_TEXT ] [ ntext ] NULL,
[ V_VARCHARMAX ] [ nvarchar ]( max ) NULL
)
-- allowed
delete from T
insert into T ( V_CHAR , V_VARCHAR , V_TEXT , V_VARCHARMAX ) values ( '' , '' , '' , '' )
select * from T
update T set V_CHAR = '*'
update T set V_VARCHAR = '*'
update T set V_TEXT = '*'
update T set V_VARCHARMAX = '*'
select * from T
select '>' + V_CHAR + '<' from T
--9 spaces are added
select '>' + V_VARCHAR + '<' from T
--OK
select '>' + V_TEXT + '<' from T
-- a ntext field can not be concatenated with other string.
select '>' + V_VARCHARMAX + '<' from T
-- a varcharmax can
update T set V_VARCHAR = replicate ( '*' , 4001 )
--cannot put more than 4000 chars in a varchar
update T set V_VARCHAR = replicate ( '*' , 4000 )
--4000 is ok
update T set V_TEXT = replicate ( '*' , 4000 )+ 'hello' + replicate ( '*' , 4000 )
--more than 4000 chars allowed in ntext
update T set V_VARCHARMAX = replicate ( '*' , 4000 )+ 'hello' + replicate ( '*' , 4000 )
--more than 4000 chars allowed in varcharmax
--so what is the difference between text and varchar max
select substring ( V_VARCHAR , 10 , 10 ) from T
select substring ( V_TEXT , 10 , 10 ) from T
select substring ( V_VARCHARMAX , 10 , 10 ) from T
-- substring possible for all varchar,text and varcharmax
select len ( V_VARCHAR ) from T
select len ( V_TEXT ) from T
-- cannot get len of text
select len ( V_VARCHARMAX ) from T
-- ok to get length of varcharmax
select charindex ( 'hello' , V_TEXT ) from T
-- charindex for text not always correct !
select charindex ( 'hello' , V_VARCHARMAX ) from T
-- ok for varcharmax
select replace ( V_VARCHAR , 'hello' , 'howareyou' ) from T
-- ok for varchar
select replace ( V_TEXT , 'hello' , 'howareyou' ) from T
-- cannot use replace on text
select replace ( V_VARCHARMAX , 'hello' , 'howareyou' ) from T
-- ok for varcharmax
from:
- http://geekswithblogs.net/claeyskurt/archive/2006/02/04/68161.aspx
- http://askville.amazon.com/SimilarQuestions.do?req=nvarchar-varchar-nchar-char-data-types-creating-SQL-table