精华内容
下载资源
问答
  • char varchar

    2019-07-26 08:42:38
    CHARVARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾 部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。 InnoDB 存储引擎和数据列 建议使用 VARCHAR类型 对于InnoDB数据...

    CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾 部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

    InnoDB 存储引擎和数据列 建议使用 VARCHAR类型 对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行 都使用指向数据列值的头指针),因此在本质上,使用固定长度的 CHAR列不一定比使 用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHAR 平均占用的空间多于VARCHAR,因 此使用VARCHAR来最小化需要处理的数据行的存储总 量和磁盘I/O是比较好的。

    展开全文
  • CHAR与VARCHAR

    2011-05-03 22:28:07
    最多的就是Char与Varchar两种类型。前面的是固定长度,而后面的是可变长度。现在我们需要考虑的是,在什么情况下使用Char字符型数据,什么 情况下采用Varchar字符型数据。在这部分内容中,我就跟大家来探讨一下这个...

    在 数据库中,字符型的数据是最多的,可以占到整个数据库的80%以上。为此正确处理字符型的数据,对于提高数据库的性能有很大的作用。在字符型数据中,用的 最多的就是Char与Varchar两种类型。前面的是固定长度,而后面的是可变长度。现在我们需要考虑的是,在什么情况下使用Char字符型数据,什么 情况下采用Varchar字符型数据。在这部分内容中,我就跟大家来探讨一下这个话题。

      一、VARCHAR与CHAR字符型数据的差异

       在MySQL数据库中,用的最多的字符型数据类型就是Varchar和Char.。这两种数据类型虽然都是用来存放字符型数据,但是无论从结构还是从数 据的保存方式来看,两者相差很大。而且其具体的实现方式,还依赖与存储引擎。我这里就以大家最常用的MYISAM存储引擎为例,谈谈这两种数据类型的差 异。在后续建议中,也是针对这种存储类型而言的。

      这里首先需要明白的一点是,这两种数据类型,无论采用哪一种存储引起,系统存储数据的方式都是不同的。正是因为如此,我们才有必要研究两者的不同。然后在合适的情况下,采用恰当的方式。了解这一点之后,我们再来看后续的内容。

       Varchar往往用来保存可变长度的字符串。简单的说,我们只是给其固定了一个最大值,然后系统会根据实际存储的数据量来分配合适的存储空间。为此相 比CHAR字符数据而言,其能够比固定长度类型占用更少的存储空间。不过在实际工作中,由于某系特殊的原因,会在这里设置例外。如管理员可以根据需要指定 ROW_FORMAT=FIXED选项。利用这个选项来创建MyISAM表的话,系统将会为每一行使用固定长度的空间。此时会造成存储空间的损耗。通常情 况下,VARCHAR数据类型能够节约磁盘空间,为此往往认为其能够提升数据库的性能。不过这里需要注意的是,这往往是一把双刃剑。其在提升性能的同时, 往往也会产生一些副作用。如因为其长度是可变的,为此在数据进行更新时可能会导致一些额外的工作。如在更改前,其字符长度是10位(Varchar规定的 最长字符数假设是50位),此时系统就只给其分配10个存储的位置(假设不考虑系统自身的开销)。更改后,其数据量达到了20位。由于没有超过最大50位 的限制,为此数据库还是允许其存储的。只是其原先的存储位置已经无法满足其存储的需求。此时系统就需要进行额外的操作。如根据存储引擎不同,有的会采用拆 分机制,而有的则会采用分页机制。

       CHAR数据类型与VARCHAR数据类型不同,其采用的是固定长度的存储方式。简单的说,就是系统总为其分配最大的存储空间。当数据保存时,即使其没 有达到最大的长度,系统也会为其分配这么多的存储空间。显然,这种存储方式会造成磁盘空间的浪费。这里笔者需要提醒的一点是,当字符位数不足时,系统并不 会采用空格来填充。相反,如果在保存CHAR值的时候,如果其后面有空值,系统还会自动过滤其空格。而在进行数据比较时,系统又会将空格填充到字符串的末 尾。

       显然,VARCHAR与CHAR两种字符型数据类型相比,最大的差异就是前者是可变长度,而后者则是固定长度。在存储时,前者会根据实际存储的数据来分 配最终的存储空间。而后者则不管实际存储数据的长度,都是根据CHAR规定的长度来分配存储空间。这是否意味着CHAR的数据类型劣于VARCHAR呢? 其实不然。否则的话,就没有必要存在CHAR字符类型了。虽然VARCHAR数据类型可以节省存储空间,提高数据处理的效率。但是其可变长度带来的一些负 面效应,有时候会抵消其带来的优势。为此在某些情况下,还是需要使用Char数据类型。

      二、项目建议

      根据上面的分析,我们知道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%左右的字符长度。千万不能认为其为根据实际长度 来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

    转载自 www.php100.com

    展开全文
  • char与varchar

    2016-10-31 19:57:00
    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你...

    区别: 

    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。 

    2.CHAR的效率比VARCHAR2的效率稍高。 

    3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。 

    何时该用CHAR,何时该用varchar2? 

    CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系. 

    VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。 

    VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

    区别: 
    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
    2.CHAR的效率比VARCHAR2的效率稍高。
    3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。
    何时该用CHAR,何时该用varchar2?
    CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.
    VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
    VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

    转载于:https://www.cnblogs.com/tofree/p/6017168.html

    展开全文
  • 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型。
  • MySQL char与varchar

    2017-02-07 09:10:56
    MySQL中char与varchar都是字符类型,但是其在存储,检索方式,最大允许长度,尾部空字符处理方面都有所不同。char与varchar在声明时都可以指明一个长度值表示允许存储的最大字符数,例如:char(10) varchar(255)。...

    MySQL中charvarchar都是字符类型,但是其在存储,检索方式,最大允许长度,尾部空字符处理方面都有所不同。

    MySQL

    char与varchar在声明时都可以指明一个长度值表示允许存储的最大字符数,例如:char(10) varchar(255)

    strict SQL模式在没被激活的情况下,Mysql允许存储大于char(varchar)声明的最大长度的字符,mysql会把字符自动裁剪到符合长度要求,并且给出警告,如果strict SQL模式被激活,对于非空字符的截断将会导致错误发生。
    #char
    char是固定字符类型,在声明的时候其大小就被确定,char允许声明的长度为【0,255】。如果实际存储的内容小于指定的长度,char类型的声明会导致值被以空格右填充到符合声明的长度后再存储,而在检索的时候,如果 PAD_CHAR_TO_FULL_LENGTHSQL模式没有被激活,内容右边的空格会被自动移除。

    #varchar
    varchar是可变字符类型,其大小随实际的存储内容而变化,varchar允许声明的长度为【0,65535】。但实际上varchar有效的长度声明受限于行大小65535bytes的限制,同时和所用的字符集也是有关系的。varchar存储数据的时候需要1byte或2byte附加于实际数据之前指示实际存储的数据长度。如果存储的数据不大于255bytes则用1byte,反之则用2bytes。varchar不会自动对存入其的数据进行空格填充,尾部空格在数据检索时也会被保留下来。

    非strict SQL模式下char(4)与varchar(4)存储对比

    Value CHAR(4) Storage Required VARCHAR(4) Storage Required
    ‘’ ’ '(4 spaces) 4 bytes ‘’ 1 byte
    ‘ab’ 'ab ’ 4 bytes ‘ab’ 3 bytes
    ‘abcd’ ‘abcd’ 4 bytes ‘abcd’ 5 bytes
    ‘abcdefgh’ ‘abcd’ 4 bytes ‘abcd’ 5 bytes

    #尾部空字符在查询时造成的影响
    由于尾空格在char类型中检索数据时会被自动移除的原因,给定的值,存储于char,varchar后再分别提取可能会发现其内容不一致。

    mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));Query OK, 0 rows affected (0.01 sec)
    mysql> INSERT INTO vc VALUES ('ab ', 'ab ');Query OK, 1 row affected (0.00 sec)
    mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
    +---------------------+---------------------+
    | CONCAT('(', v, ')') | CONCAT('(', c, ')') |
    +---------------------+---------------------+
    | (ab ) | (ab) |
    +---------------------+---------------------+
    1 row in set (0.06 sec)
    

    MySQL中所有的校对规则都是PADSPACE类型的,所以在比较时候的时候尾部空字符是不影响比较(不包括LIKE)结果的。该规则对所有MySQL版本都适用,也和SQL模式没关系。

    mysql> CREATE TABLE names (myname CHAR(10));Query OK, 0 rows affected (0.03 sec)
    mysql> INSERT INTO names VALUES ('Monty');Query OK, 1 row affected (0.00 sec)
    mysql> SELECT myname = 'Monty', myname = 'Monty ' FROM names;
    +------------------+--------------------+
    |myname = 'Monty' | myname = 'Monty '  |
    +------------------+--------------------+
    | 1 | 1 |
    +------------------+--------------------+
    1 row in set (0.00 sec)
    mysql> SELECT myname LIKE 'Monty', myname LIKE 'Monty ' FROM names;
    +---------------------+-----------------------+
    | myname LIKE 'Monty' | myname LIKE 'Monty ' |
    +---------------------+-----------------------+
    | 1 | 0 |
    +---------------------+-----------------------+
    1 row in set (0.00 sec)
    

    鉴于上述原因,在尾部的空字符会被自动剥离截断以及比较时忽略尾部空字符的情况下,对于有unique约束的列,同时插入’a’, 'a '将会导致duplicate-key的错误。

    展开全文
  • CHAR与VARCHAR1

    2020-07-08 22:28:02
    ###附1 :关于CHAR与VARCHAR CHAR定长的,而VARCHAR变长的; 假设设置为CHAR(10)、或VARCHAR(10)i, 假设存储hello字符串,使佣CHAR(10)时,会补_上5个空格得到设置值 10~ 的长度,如果使用VARCHAR(10)时,只存储hello,...
  • 本文介绍了 MySQL 中 CHAR VARCHAR 的区别的相关内容。。。
  • 数据库中char与varchar

    2020-05-25 10:57:43
    char与varchar 在一次数据库与前端通信时遇到String.equals()比较时发现明明数据打印出来一致,但比较结果仍然为false。在之后的debug过程中才发现是数据库中的数据类型使用了char导致的。 char:数据固定长度,如...
  • CHAR VARCHAR的区别

    2017-06-27 17:42:44
    为什么要谈CHAR与VARCHAR?大家可能想CHAR和VARCHAR这种东西再简单不过了,只不过是MySQL中最基本的数据类型,有什么好深究的。其实有时候越简单、越基础的东西越复杂,越难以捉摸。 大家在使用MySQL创建数据表时...
  • 在字符型数据中,用的最多的就是 Char与Varchar两种类型。前面的是固定长度,而后面的是可变长度。现在我们需要考虑的是,在什么情况下使用Char字符型数据,什么情况下采用 Varchar字符型数据。 一、VARCHAR与CHAR...
  • char与varchar的区别

    2019-08-22 08:35:06
    复习数据库的时候,注意到一个比较有意思的,之前没怎么注意的问题,就是char与varchar的区别。在此做小小的一个学习记录 两者最根本的区别是:char的长度是确定好的,而varchar的长度是可变的,比如说存“abc”,则...
  • mysql中char与varchar的区别
  • 字符与字节的区别 一个字符由于所使用的字符集的不同,会并存储在一个...注意:char与varchar后面接的数据大小为存储的字符数,而不是字节数   char与varchar的差异   为方便说明,我们下面定义一个表: C...
  • 各位DBA同事及开发童鞋,相信你们看了这篇文章,会彻底明白char与varchar应该如何去选择使用。首先讲解一下char与varchar。 char(n):n的最大值为255 varchar(n):n的理论最大值65535,其实也就最多65532 这里需要...
  • char与varchar的区别:char(100)类型的字段一旦定义,不管里面是否有值,固定占用100个字符对应的存储空间,这种对空间的利用率其实并不高,但是效率较快。varchar(100)类型的字段定义后,它所占用的空间就是里面...
  • char与varchar的区别?

    2020-03-08 22:06:00
    char与varchar的区别? char是一种固定长度的类型 varchar则是一种可变长度的类型 varchar(M),M代表最大能存多少个字符,(MySql5.0.3以前是字节,以后是字符) 变长字段长度列表分析 MySQL支持一些变长的数据...
  • 注意:char与varchar后面接的数据大小为存储的字符数,而不是字节数(其实是5.0版本以上是这样) 字符表示无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节。 char与...
  • MySQL中的char与varchar详解 https://www.cnblogs.com/Lance--blog/p/5193027.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,995
精华内容 1,198
关键字:

char与varchar