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

本文详细解释了SQL2005中char、nchar、varchar、nvarchar等数据类型的区别及应用场景,并通过实例演示了这些类型的具体使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        对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的主要用途是当你处理不同国家字符,比如日语或汉语。

      三、一个例子:

 


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  ( V_CHAR , V_VARCHAR , V_TEXT , V_VARCHARMAX values  ( '' , '' , '' , '' )
select  from  T
update  set  V_CHAR = '*'
update  set  V_VARCHAR = '*'
update  set  V_TEXT = '*'
update  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  set  V_VARCHAR = replicate ( '*' , 4001 )
--cannot put more than 4000 chars in a varchar
update  set  V_VARCHAR = replicate ( '*' , 4000 )
--4000 is ok
update  set  V_TEXT = replicate ( '*' , 4000 )+ 'hello' + replicate ( '*' , 4000 )
--more than 4000 chars allowed in ntext
update  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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值