`
uule
  • 浏览: 6351616 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

char/varchar/nvarchar的区别及其各自的使用场景

 
阅读更多

MySQL数据库char与varchar的区别分析及使用建议

 

char 

char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符

 

varchar(n) 

长度为 n 个字节的可变长度非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。

 

nvarchar(n) 

包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。

 

 

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

 

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。

 

二、项目建议

 

根据上面的分析,我们知道VARCHAR数据类型是一把双刃剑,其在带来性能提升的同时,也可能会存在着一些额外的消耗。我们在评估到底是使用VARCHAR数据类型还是采用CHAR数据类型时,就需要进行均衡。在实际项目中,我们会考量如下情况。

 

一是根据字符的长度来判断某个字段,像人的名字,其最长的长度也是有限的。如我们给其分配18个字符长度即可。此时虽然每个人的名字长度有可能 不同,但是即使为其分配了固定长度的字符类型,即18个字符长度,最后浪费的空间也不是很大。而如果采用NVARCHAR数据类型时,万一以后需要改名, 而原先的存储空间不足用来容纳新的值,反而会造成一些额外的工作。在这种情况下,进行均衡时,会认为采用CHAR固定长度的数据类型更好。在实际项目中, 如果某个字段的字符长度比较短此时一般是采用固定字符长度。

 

二是考虑其长度的是否相近。如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较 适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常使用采用CHAR字符类型。因为其长度是相同 的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据

 

另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是 VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销CHAR 字符类型是没有的。

 

三是从碎片角度进行考虑。使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不 存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符 型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。

 

 

四是即使使用Varchar数据类型,也不能够太过于慷慨。这是什么意思呢?如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可 以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分 配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储 空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来 说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都 需要通过内存来实现)作业会产生比较大的不利影响。所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太 过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际 长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

分享到:
评论

相关推荐

    char、varchar、nchar、nvarchar四种类型的区别

    ### char、varchar、nchar、nvarchar 四种类型的区别 在数据库设计中,选择合适的字段类型对于确保数据的准确性和提高查询效率至关重要。对于字符类型的字段,SQL Server 提供了 `char`、`varchar`、`nchar` 和 `...

    SQLServer中char、varchar、nchar、nvarchar的区别

    在SQL Server数据库管理系统中,字符数据类型是存储文本信息的基础,包括`char`、`varchar`、`nchar`和`nvarchar`等几种常见的类型。这些数据类型在存储字符串时有着不同的特性和用途,理解它们之间的区别对于正确...

    oracle char,varchar,varchar2的区别和使用方法

    ### Oracle CHAR, VARCHAR, VARCHAR2 的区别与使用方法 在 Oracle 数据库中,字符串类型是极为常见的数据类型之一,主要用于存储文本数据。其中最常用的三种类型包括:`CHAR`, `VARCHAR`, 和 `VARCHAR2`。这三种...

    SQL Server数据类型char、nchar、varchar、nvarchar的区别浅析

    本文主要探讨了四个常见的字符数据类型:char、nchar、varchar和nvarchar,它们各自具有独特的特性和用途。 1. **char数据类型** - `char`是一种固定长度的非Unicode字符数据类型,适用于存储长度恒定的文本信息。...

    SQL2005中char nchar varchar nvarchar数据类型的区别和使用环境讲解

    本文主要探讨四个重要的字符数据类型:`char`、`nchar`、`varchar`和`nvarchar`,它们各自有其特点和适用场景。 首先,`char`数据类型是一种固定长度的非Unicode字符数据类型。它在创建时需要指定一个长度`n`,范围...

    varChar和Char之间的区别?

    `nchar`和`nvarchar`的使用场景与`char`和`varchar`类似,但它们支持更大的字符集,包括各种语言和特殊符号,但这也意味着更高的存储需求。 在面试中,了解这些数据类型的特点和应用场景是十分重要的。合理选择数据...

    浅析Oracle中char和varchar2的区别

    至于`VARCHAR2`和`NVARCHAR2`的区别,`NVARCHAR2`是Unicode字符串类型,可以存储不同语言的字符,而`VARCHAR2`则只支持数据库的默认字符集。如果你需要处理多语言数据或者需要更广泛的字符支持,`NVARCHAR2`是更好的...

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

    在SQL中,`varchar`和`...对于包含非英文字符的场景,推荐使用`nvarchar`,而对于纯英文或数字的数据,`varchar`可能是更好的选择。同时,根据数据的长度特性,可以决定使用定长或变长类型,以优化存储和查询性能。

    char的几种类型

    综上所述,CHAR和VARCHAR的区别主要在于是否固定长度,而NCHAR和NVARCHAR则是在处理Unicode字符集的基础上,提供了固定和可变长度两种选择。选择合适的数据类型对于优化数据库性能和空间利用至关重要。例如,当存储...

    mssql数据库 char vchar nchar nvchar异同

    本文将详细介绍`CHAR`、`VARCHAR`、`NCHAR`与`NVARCHAR`这四种字符类型之间的区别,帮助读者更好地理解它们的特点及适用场景。 #### 1. CHAR (Character) - **定义**:`CHAR`是一种固定长度的字符数据类型,其长度...

    MySQL中VARCHAR与CHAR格式数据的区别

    在MySQL数据库中,CHAR和VARCHAR是两种常用的字符串数据类型,它们在存储和处理方式上有着显著的区别,这对于数据库设计和优化至关重要。 首先,CHAR是一种固定长度的字符串类型。这意味着无论你存储的实际数据有多...

    MSSQL中所有字段类型的区别

    一、char、varchar、text 和 nchar、nvarchar、ntext 的区别 char、varchar、text 是用于存储字符串类型的数据,而 nchar、nvarchar、ntext 是用于存储 Unicode 字符串类型的数据。 1. char char 类型用于存储定...

    uniqueidentifier转换成varchar数据类型的sql语句

    需要注意的是,`uniqueidentifier`类型的值在内存中占据16字节,但其显示形式通常为32个字符的十六进制字符串,因此转换时通常使用 `char(36)` 或 `varchar(36)` 而非 `char(255)` 或 `varchar(255)`。例如: ```...

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

    在SQL Server数据库中,了解和正确使用定长(char)和变长(varchar)数据类型是至关重要的,因为它们直接影响到存储效率、查询性能以及数据库的总体设计。下面将详细阐述这两种数据类型的特性和区别。 首先,`char(n)`...

    MySql Oracle SqlServer三大数据库的数据类型列表.pdf

    4. 字符串:CHAR、VARCHAR、NVARCHAR、TEXT 和 NTEXT,其中 NVARCHAR 和 NTEXT 用于存储Unicode数据。 5. 日期和时间:DATE、TIME、DATETIME2、DATETIMEOFFSET,以及旧的 DATETIME 和 SMALLDATETIME 类型。 6. 二...

    Oracle各种数据类型的介绍,适合中高级编程开发人员

    - **NCHAR/NVARCHAR2**: 这两种类型类似于CHAR/VARCHAR2,但它们主要用于存储Unicode字符数据,因此每个字符占用的空间更大。NCHAR的最大长度为2000个字符,而NVARCHAR2的最大长度为4000个字符。 #### Number 类型 ...

    MySqlOracleSqlServer三大数据库的数据类型列表汇编.docx

    【MySQL 数据类型】 MySQL 数据类型主要分为以下几类: 1. 整数类型:包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT。...理解这些数据类型及其使用场景是数据库设计和管理的基础。

    SQL数据类型详细介绍

    对于非常长的文本,可以使用`VARCHAR(MAX)`或`NVARCHAR(MAX)`代替`TEXT`和`NTEXT`,因为它们提供了更好的性能和更广泛的使用场景。 总结来说,理解SQL中的字符数据类型及其差异对于创建高效、兼容性强的数据库非常...

    SQLServer数据库基本知识点.pdf

    14. **Char/Varchar**: 非统一编码的字符数据类型,Char是定长,Varchar是变长。Char需要指定长度,Varchar存储实际长度,节省空间。 15. **Text**: 存储大量非统一编码的字符数据,适用于存储长文本。 16. **...

Global site tag (gtag.js) - Google Analytics