转:http://blog.csdn.net/jackychu/article/details/4183118

http://www.cnblogs.com/jhxk/articles/1633578.html

很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大手一挥 一把人民币就从他手里溜走了,其实我想不管是做人也好,做开发也好,细节的把握直接决定很多东西。当然还有一部分人是根本就没弄清楚他们的区别,也就随便 选一个。在这里我想对他们做个简单的分析,当然如果有不对的地方希望大家指教。

1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。

2、
VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为
VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。
从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

4、
NCHAR、NVARCHAR、NTEXT
。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英
文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼
容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和
char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储
8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量
上有些损失。

所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

我把他们的区别概括成:

CHAR,NCHAR 定长,速度快,占空间大,需处理
VARCHAR,NVARCHAR,TEXT 不定长,空间小,速度慢,无需处理
NCHAR、NVARCHAR、NTEXT处理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 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个字节的数据。

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

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

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

nvarchar(max)-----ntext;

varbinary(max)----image.

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

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


2014年10月16日11:34:19

对SQL Server数据库的数据类型存储的学习掌握的确实不太好,我觉得我以前就是作者说的现在的年轻人,看了一点资料,对作者说的进行一下总结:

1.数据类型的对应关系:

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

nvarchar(max)-----ntext;

varbinary(max)----image.

2.现在尽量不用text,ntext,image类型来存储数据了

3.从空间上考虑,用varchar合适(其实还是尽量使用varchar,毕竟现在是大数据时代);从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

4.使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

5.

支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。

如果希望列中的数据值大小接近一致,请使用 char。

如果希望列中的数据值大小显著不同,请使用 varchar。

如果希望列中所有数据项的大小接近一致,则使用 nchar。

如果希望列中数据项的大小差异很大,则使用 nvarchar。

如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF,则一个定义为 NULL 的 char 列将被作为 varchar 处理。

6.

1)如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char
2)能确定长度又不一定是ansi字符或者,那么用nchar;
3)不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它们设到400;
4)不查询的话没什么好说的,用nvarchar(4000)

7.

CHAR,NCHAR 定长,速度快,占空间大,需处理
VARCHAR,NVARCHAR,TEXT 不定长,空间小,速度慢,无需处理
NCHAR、NVARCHAR、NTEXT处理Unicode码

SQL Server中char、varchar、text和nchar、nvarchar、ntext的区别 (转)的更多相关文章

  1. SQL Server中char与varchar数据类型区别

    在SQL Server中char类型的长度是不可变的,而varchar的长度是可变的 . 存入数据时: 如果数据类型为char时,当定义一个字段固定长度时,如果存进去数据长度小于char的长度,那么存 ...

  2. sql server中的varchar和Nvarchar有什么区别?

    很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大 ...

  3. mysql中char,varchar,text

    1.char char最大长度是255字符,注意是字符数和字符集没关系. 1)可以有默认值, 2)尾部有空格会被截断 3)不管汉字.英文,还是其他编码,都可以存255字符 2.varchar 1)va ...

  4. oracle和sql server中,取前10条数据语法的区别

    在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...

  5. [Android Pro] sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别

    reference : http://blog.csdn.net/xingfeng0501/article/details/7817121 1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索 ...

  6. sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别

    1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充. 2.VAR ...

  7. sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别(转)

    sqlite数据库存储table1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不 ...

  8. SQL Server中,Numric,Decimal,Money三种字段类型的区别

    都是精确数据类型, 前两个可以自己定义长度和小数位数, Money的定义相当于Numric(19,4) numeric(10,2) 表示最大可以放10位数,但这10位数里有2位是小数如: 123456 ...

  9. mysql中char,varchar,text区别总结

    具体对这三种类型的说明不做阐述可以查看mysql帮助文档. char的总结:      char最大长度是255字符,注意是字符数和字符集没关系.可以有默认值,尾部有空格会被截断.varchar的总结 ...

随机推荐

  1. SyntaxError: missing ] after element list

    在前端页面js报错,找了很久没找到原因. 后来发现是后台向前端输出json字符串,而前端接收是html格式,需要将后台json字符串改成正常字符串就可以输出,或者通过ajax的方式接收json字符串.

  2. 用倍增法构造后缀数组中的SA及RANK数组

    感觉后缀数组很难学的说= = 不过总算是啃下来了 首先 我们需要理解一下倍增法构造的原理 设原串的长度为n 对于每个子串 我们将它用'\0'补成长度为2^k的串(2^k-1<n<=2^k) ...

  3. Spring中ApplicationContext加载机制和配置初始化

    Spring中ApplicationContext加载机制.        加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet.        ...

  4. Zlib not installed

    若提示:zlib not installed   wget http://zlib.net/zlib-1.2.8.tar.gz   tar zxf zlib-1.2.8.tar.gz cd zlib- ...

  5. linux to extract contents between patterns

    参考:http://stackoverflow.com/questions/19177721/extract-lines-between-two-patterns-from-a-lfile awk ' ...

  6. RQNOJ PID331 家族

    题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是 ...

  7. 苹果系统下的浏览器 Date方法处理

    1.做了一个活动,需要用到倒计时.比较坑的是苹果下的浏览器不识别new Date("2018-12-23 10:00:00").getTime()格式.所以孕育了一个bug小生命. ...

  8. VB - 修改注册表

    Vbs中修改注册表的语句主要有: 1.读注册表的关键词和值: 可以通过把关键词的完整路径传递给wshshell对象的regread方法.例如: set ws=wscript.createobject( ...

  9. 2.Jmeter 如何在jsr223 脚本中停止测试任务

    Jmeter 如何在jsr223 脚本中停止测试任务 在可以直接引用ctx的变量的processor中可以执行如下脚本即可. (例如jsr223 postprocessor中) ctx.getEngi ...

  10. Codeforces 1140C(贪心+堆)

    题面 传送门 题意: 给出长度为n的序列b,t,定义一个子序列的值为\(\min\{ b_i\} \times \sum t_i\),求所有子序列中值最大的一个,输出最大值 分析 假如固定某个b[i] ...