`
bluenemo
  • 浏览: 179068 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

varchar(n),nvarchar(n) 长度、性能、及所占空间分析

阅读更多
varchar(n),nvarchar(n) 中的n怎么解释:
  nvarchar(n)最多能存n个字符,不区分中英文。
  varchar(n)最多能存n个字节,一个中文是两个字节。

所占空间:
  nvarchar(n)一个字符会占两个字节空间。
  varchar(n)中文占两字节空间,英文占一个。

n的取值范围:
  nvarchar(n)   n的范围是:1与4000之间
  varchar(n)   n的范围是:1与8000之间

n的大小是否会影响性能:
  varchar及nvarchar里的长度 n 不会影响空间大小及性能。除非n是max并且内容大于4000或8000
  设置n更多的是业务需要,如限制身份证只能输入18位,再多就报错,或者防止恶意攻击撑爆硬盘。对空间及性能都没有影响

n设置多大比较好:
  既然对空间及性能都没有影响,那我们只要考虑业务需要就可以了,我分析过微软的数据库,大都设置为:256,也会看到64,128,512,max等,可能是便于记忆吧。

varchar(n),nvarchar(n)存储空间举例解释:
  包含 n 个字符的可变长度 Unicode 字符数据。字节的存储大小是所输入字符个数的两倍。 
  两字段分别有字段值:我和coffee 
  那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。 
  如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar。

varchar和nvarchar如何选择?

  varchar在SQL Server中是采用单字节来存储数据的,nvarchar是使用Unicode来存储数据的.中文字符存储到SQL Server中会保存为两个字节(一般采用Unicode编码),英文字符保存到数据库中,如果字段的类型为varchar,则只会占用一个字节,而如果字段的类型为nvarchar,则会占用两个字节.
  正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时, 在SQL Server存储中文字符为varchar就会出现乱码(显示为??).而且正常情况下,主机都会支持中文的环境,所以如果使用varchar来存储数据,在开发阶段是发现不了的.多数情况下,在布署的时候也不会有问题.
  但是!如果布署的主机是英文操作系统,并且不支持中文环境,那问题就出来了.所有的varchar字段在存储中文的时候都会变成乱码(显示为??).而且一般情况下你不会知道这是因为你采用了错误的数据类型来存储所造成的,你会试着去装中文字体,试着去设置操作系统的语言环境...这些都不能解决问题,唯一能解决问题的是把数据库字段的类型个性为nvarchar(或者nchar).对项目管理比较熟悉的朋友应该都知道,到布署阶段再来修改数据库是一个很恐怖的事情.
  使用nvarchar的另一个非常好处就是在判断字符串的时候可以不需要考虑中英文两种字符的差别.
  当然,使用nvarchar存储英文字符会增大一倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的.
  所以在Design的时候应该尽量使用nvarchar来存储数据.只有在你确保该字段不会保存中文的时候,才采用varchar来存储.


----------------------------------------------------------------------
   如果 varchar(300) 和 varchar(8000) 都存储相同的字符数,性能上是没有差别的,存储行为上也没有不同。因为它们都有相同的存储结构,两个字节的偏移,两个字节的列数(如果表中所有的列都是 varchar 类型)。区别只在于存储容量上。
大多数的性能比较都集中在 varchar 和 char,varchar 和 varchar(max) 上。还有,行外存储(SQL Server 2005 支持的)。

  varchar(max) (lob 类型)与 varchar 存储方式是不同的。
  当 LOB 数据足够小时,可以考虑将数据直接存储在数据行(行所在的数据页面)中,从而可以避免额外的读取 LOB 页面,提升访问 LOB 数据的效率(将 LOB 数据直接存储在数据页面的阈值由 text in row 选项设置)。
而当 LOB 数据大于此阈值,或者所在行的大小超过了 8060 字节(单行最大 SIZE),LOB 数据将会存储在 LOB 页面,而在数据页面中保留一个指向 LOB 页面的 16 字节的指针。其访问效率当然会将低。
另外还有,恶意用户可以利用这一点“撑爆”你的磁盘。

分享到:
评论

相关推荐

    SQL中varchar和nvarchar的基本介绍及其区别

    在SQL中,`varchar`和`nvarchar...综上所述,`varchar`和`nvarchar`的选择应基于数据的具体需求,包括字符集、长度和性能。在设计数据库表结构时,正确地选择这些数据类型可以提高存储效率,保证数据的准确性和完整性。

    深入SQL Server中定长char(n)与变长varchar(n)的区别详解

    而当字段长度变化大,且对节省存储空间有较高需求时,推荐使用`varchar(n)`。同时,考虑到数据库的扩展性和未来可能的数据增长,`varchar(n)`通常更为灵活。 此外,SQL Server还提供了一种`nvarchar(n)`数据类型,...

    数据库存储类型

    在数据库设计与应用中,数据类型的选择至关重要,它不仅直接影响到数据的存储方式、占用空间大小,还会影响查询性能及数据处理逻辑。本文将详细介绍几种常见的数据库存储类型及其特点。 #### 整型数据类型 1. **...

    SQLserver2008 数据库性能优化

    例如,选择可变长度的数据类型(varchar 之类)可以减少存储空间浪费。对于固定长度字段,如电话号码等,可以用 char 类型,提高索引效率和查询效率。 此外,避免使用 n 开头的类型(如 nvarchar),因为它们占用更...

    第3讲SQL Server数据类型和使用.rar

    - `VARCHAR(n)`:可变长度的字符数据,n为最大长度(1到8000个字符)。 - `NVARCHAR(n)`:可变长度的Unicode字符数据,n最大为4000。 - `CHAR(n)`:固定长度的非Unicode字符数据,n最大为8000。 - `NCHAR(n)`:...

    [整理版]oracle数据类型及存储方式.doc

    2. **VARCHAR2**: VARCHAR2 是可变长度的字符串类型,只存储实际输入的数据长度,不浪费空间。例如,VARCHAR2(10) 只会占用实际字符数的空间,最多不超过10个字符。 3. **BYTE 和 CHAR**: 在Oracle中,VARCHAR2可以...

    sql数据库的数据类型详细解释.pdf

    - `Nvarchar`:存储变长度的Unicode字符,同样最多4000个字符,节省空间,适合长度不固定的多语言数据。 - `Ntext`:用于存储超过4000个Unicode字符的数据,适合存储大篇幅的多语言文本。 4. **日期和时间数据...

    SQL_Server数据类型说明.doc

    3. **VARCHAR**:VARCHAR[(n)]存储可变长度的非Unicode字符数据,n的值在1到8000之间,存储长度为实际字符长度+2个字节。 4. **NVARCHAR**:与VARCHAR类似,但用于Unicode字符,每个字符占用2个字节,存储长度为实际...

    数据库数据结构

    - `Varchar[(n)]`:存储可变长度的ASCII字符数据,最大长度为8KB。 - `Text`:用于存储超过8KB的ASCII文本数据。 3. **Unicode数据类型**: - `Nchar[(n)]`:存储固定长度的Unicode字符数据,最大长度为4000个...

    oracle数据类型及存储方式.doc

    在Oracle中,`VARCHAR2`可以指定为`VARCHAR2(n BYTES)`或`VARCHAR2(n CHAR)`,前者按字节计数,后者按字符计数。对于非ASCII字符集,`BYTES`可能需要更多空间。 #### §1.4 CHAR 还是 VARCHAR2 通常,选择`VARCHAR...

    sql server 数据类型

    varchar(n)是可变长度的字符数据类型,适合存储长度不固定的数据,如人名或地址。它只占用实际字符所需的空间,节省存储空间。text数据类型则用于存储超过8000个字符的超长文本,如文章或报告。 数值型数据类型是...

    Oracle数据类型说明

    - **VARCHAR2(n)**:可变长度的字符串,`n` 指定了最大长度。该类型可以存储数字、字母及 ASCII 码字符集中的所有符号。如果数据长度未达到最大值 `n`,Oracle 会根据数据大小自动调节字段长度。此类型是 Oracle 最...

    精彩编程与编程技巧-SQL的基本操作(1.数据类型)...

    - **变长字符串**:如 `varchar(n)`,占用的存储空间取决于实际存储的字符数量,但最大不超过 n 字节。 - **文本类型**:如 `text`,用于存储大量文本数据,最大支持 2^31-1 个字符。 #### 3. Unicode 类型 ...

    sqlserver数据类型

    2. **`nvarchar[(n)]`**:可变长度的 Unicode 字符数据类型,最大长度为 4000 字节。如果未指定长度,则默认值为 1。实际占用空间为其实际长度加上 4 字节的开销。 - **用途**:适合存储可变长度的 Unicode 文本...

    SQLserver数据类型详解.pdf

    SQL Server 数据类型是数据库设计的...正确选择数据类型可以节省存储空间,提高查询性能,并确保数据的准确性和一致性。在设计数据库时,应考虑数据的范围、精度需求以及是否需要自动递增等因素来选择适当的数据类型。

    N字符在Sql Server字段类型中的重要性概述

    5. 存储限制:`NVARCHAR`和`NCHAR`的最大长度为4000个字符,而`VARCHAR`和`CHAR`最大可达8000个单字节字符。如果需要存储更多文本,可以使用`VARCHAR(MAX)`或`NVARCHAR(MAX)`。 总的来说,理解`N`字符前缀的含义...

    SQL2005的数据类型详解

    - **`varbinary`**:用于存储可变长度的二进制数据,例如`varbinary(n)`,n的取值范围同样为1到8000,实际占用空间为实际数据长度加上4个字节。 #### 布尔类型 - **`bit`**:用于存储布尔值,只能存储0或1两个值,...

    SQL字段类型

    `varchar`是变长字符数据类型,仅存储实际输入的字符长度,节省空间。 - `text`:用于存储大量非Unicode文本,最大长度可达2GB。 - `nchar`、`nvarchar` 和 `ntext`:这些是Unicode字符类型,增加了“n”前缀,...

    SQLServer常用字段类型

    2. **Varchar(n)** 和 **Nvarchar(n)**:变长字符类型,更节省空间,同样适用于ASCII和Unicode字符集,适合存储长度可变的文本,如姓名、地址等。 3. **Text** 和 **Ntext**:用于存储大量文本,分别对应ASCII和...

Global site tag (gtag.js) - Google Analytics