SQL Server中的nchar,nvarchar,text,ntext,char,varchar比较.docx_第1页
SQL Server中的nchar,nvarchar,text,ntext,char,varchar比较.docx_第2页
SQL Server中的nchar,nvarchar,text,ntext,char,varchar比较.docx_第3页
SQL Server中的nchar,nvarchar,text,ntext,char,varchar比较.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SQL Server中的nchar,nvarchar,text,ntext,char,varchar比较参考文献:/mekong/archive/2009/04/17/1437996.html/en-us/library/ms186939.aspx前言这几天在查阅sql server collation的问题,这其中就牵涉到了unicode,non-unicode,varchar,nvarchar,ANSI等字符编码的问题。首先我们讲解一些基础背景知识定长或变长所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;有var前缀的,表示是实际存储空间是变长的,比如varchar,nvarchar变长字符数据则不会以空格填充,比较例外的是,text存储的也是可变长。Unicode或non-Unicode数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。至于为什么英文字幕是一个字符,占用一个字节,而汉字是两个字符,占用两个字节。这是因为英文字幕只有26个,一个字节有8位,对应着有28=256种编码对应,远大于26,因此可以用一个字节来存储。但是汉字的数量远远大于一个字节所能对应的编码数量,所以必须使用两个字节,也就有了216=65536种编码对应每一个汉字。在unicode字符集中,汉字占了5万多个。字段容量接下来我们看一下char,varchar,nchar和nvarchar能存储多个内容,如下表所示:char,varchar最多8000个英文,4000个汉字nchar,nvarchar可存储4000个字符,无论英文还是汉字分析1:之索引是8000,是因为在sqlserver中一个page是8kb,而用于存储行数据的只有8060字节。这四种数据类型用于修饰表中的一个列,所以列的长度肯定不能大于8060,剩下的60字节具体做什么还不清楚。分析2:varchar是按字节存储的,而nvarchar是按字符存储的 。比如说 , varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节。所以varchar(40)只能存储20个中文字符。nvarchar(40),就可以存储40个中文字符,但是它所占用的存储空间是80字节,但是还是只能存储40个英文字符。实验说明:-实验1:测试nvarchar和varchar的存储长度-创建一个默认collation为Chinese_PRC_CI_AS的数据库TESTDB3USE TESTDB1CREATE TABLE test( lastname NVARCHAR(8) NOT NULL,-nvarchar类型,双字节存储 title VARCHAR(8) NOT NULL, -varchar类型,单字节存储);insert into test values(姓名1,标题1);select * from test;insert into test values(123456789,1);-String or binary data would be truncated.insert into test values(12345678,1);insert into test values(1,12345678);insert into test values(一二三四五六七八,一二三四);select * from test;-总结:/*1.nvarchar(n),按字符来存储,不论是英文字符还是中文字符。最多能够存储n个中文或者是英文,但是所占用的存储空间是2n+2个字节。1=n=40002.varchar(n)按字节存储,最多能够存储n个英文字母,存储n/2个中文字符。但是所占用的存储空间是n个字节。1=n=8000*/CHAR 和 VARCHARCHAR 存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。VARCHAR 存储变长数据,但存储效率没有CHAR高,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+2。为什么+2呢?这一个字节用于保存实际使用了多大的长度。这个可以在MSDN上找到:varchar ( n | max ) Variable-length, non-Unicode string data. n defines the string length and can be a value from 1 through 8,000. max indicates that the maximum storage size is 231-1 bytes (2 GB). The storage size is the actual length of the data entered + 2 bytes. 因此,从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。TEXT、NCHAR、NVARCHAR、NTEXTTEXT text存储可变长度的非Unicode数据,最大长度为231-1(2,147,483,647)个字符,2GB。NCHAR、NVARCHAR、NTEXT 这三种从名字上看比前面三种多了个N。和char、varchar比较起来,nchar、nvarchar最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论