精华内容
下载资源
问答
  • Mysql的CHAR和VARCHAR类型的区别
    2022-02-22 16:48:36

    char和varchar的区别

    char是一种固定长度的类型,varchar则是一种可变长度的类型
    char是定长的,也就是当你输入的字符小于你指定的数目时,它会在后面不空值。(查询时结果中空值被去除)
    varchar的长度为n个字节的可变长度,varchar(8)类型的数据列里,每个值只占用刚好够用的字节,再加上一个用来记录其长度的字节
    从空间上考虑,用varchar合适;从效率上考虑,用char合适;关键还是要根据实际情况

    更多相关内容
  • CHAR和VARCHAR类型相似,差别主要在存储,尾随空格检索方式上。 CHAR和VARCHAR相同的是:CHAR和VARCHAR都指定了字符长度,注意是字符长度。例如char(30) varchar(30)表示都可以存30个字符。有一点要注意的是在...
  • char是定长的 char(10) varchar2(10) 同样存 a ,char占用了10个字符,varchar2 ... 您可能感兴趣的文章:oracle to_char函数将number转成stringOracle to_char函数的使用方法SQL中CharindexOracle中对应的函数Instr
  • MySQL中CHAR和VARCHAR区别

    千次阅读 2020-12-09 09:39:03
    以下都是基于mysql5.0以上版本而言,也就是char和varchar括号内指定的都是最大字符数,话不多说先上结论: 行为 char字段 varchar字段 最大长度 255字符 括号中最大的字符数通过编码来算,不超过行65535个...

    以下都是基于mysql5.0以上版本而言,也就是char和varchar括号内指定的都是最大字符数,话不多说先上结论:

    行为char字段varchar字段
    最大长度255字符括号中最大的字符数通过编码来算,不超过行65535个字节
    是否定长定长,不足的部分用隐藏空格填充不定长,保留实际字符
    空间使用可能浪费更加节省
    查找效率
    尾部空格插入时省略插入时不会省略,查找时可省略
    like查找语句中like后的’ '不会省语句中like后的’ '不会省,字段结尾的空格也不会省

    以上都是指严格模式下的情况,如果修改为宽松模式,插入时超过指定最大字符数会截取然后插入。具体改变宽松模式看:mysql修改sql_mode为宽松模式https://www.cnblogs.com/ningjiabing/p/12795338.html

    测试

    测试一下是不是如结论,所说尾部空格,包括:长度查看、尾部空格、查询的测试

    建立表tset_char_varchar

    -----------建表------------
    CREATE TABLE tset_char_varchar
    (
        id       int PRIMARY KEY,
        _char    CHAR(10)    DEFAULT NULL,
        _varchar varchar(10) DEFAULT NULL
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4 COMMENT ='测试char和varchar区别表';
    TRUNCATE tset_char_varchar;
    
    
    -----------插入-------------
    INSERT INTO
        tset_char_varchar VALUE
        (1, '123456', '123456'),
        (2, '0123456789', '0123456789'),
        (3, '一二三四五六七八九十', '一二三四五六七八九十');
    
    -----------查询-------------
    SELECT
        _char,
        CHAR_LENGTH(_char) char字符数,
        LENGTH(_char)      char字节数,
        _varchar,
        CHAR_LENGTH(_varchar) varchar字符数,
        LENGTH(_varchar)      varchar字节数
    FROM
        tset_char_varchar;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGIvpGKL-1607477835313)(MySQL中char和varchar区别.assets/image-20201208170450416.png)]

    从上图可以看到插入不足10个字符、10个数字、十个汉字所对应的字符数和子节数,在这里还没看出差别。(当然如果插入的字符数>10会报错)

    接下来测试一下带空格的数据

    ---为了查看方便把以上数据删除--
    TRUNCATE tset_char_varchar;
    
    -------插入数据------
    INSERT INTO
        tset_char_varchar
    VALUES
        (1, 'a', 'a'),
        (2,' a',' a'),
        (3,'a ','a '),
        (4,' a ',' a ');
    

    1为不带空格,2为左边带空格,3为右边带空格,4为两边都带空格

    插入之后查看查询结果:

    SELECT
        _char,
        CHAR_LENGTH(_char)    char字符数,
        LENGTH(_char)         char字节数,
        _varchar,
        CHAR_LENGTH(_varchar) varchar字符数,
        LENGTH(_varchar)      varchar字节数
    FROM
        tset_char_varchar;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SCnyfE0H-1607477835316)(MySQL中char和varchar区别.assets/image-20201208171434273.png)]

    看第3、4条数据的字符数和字节数出现了不一致。

    id=3存储的是只有右边有空格,那么varchar把空格保留下来了,可以推断出id=4这条数据char中缺失的就是右边空格所占的字节,如果不信的话,下面进行验证。

    测试查询带空格的数据

    1. 查询_char不带空格的结果:
    SELECT * FROM tset_char_varchar WHERE _char = 'a';
    

    1. 查询_char左侧空格的结果:
    SELECT * FROM tset_char_varchar WHERE _char = ' a';
    

    1. 查询_char右侧空格的结果:
    SELECT * FROM tset_char_varchar WHERE _char = 'a ';
    

    结果什么都没有!

    1. 查询查询_char两侧空格的结果:
    SELECT * FROM tset_char_varchar WHERE _char = ' a ';	
    

    结果什么都没有!

    1. 查询查询_varchar结果:
    SELECT * FROM tset_char_varchar WHERE _varchar = 'a ';	
    SELECT * FROM tset_char_varchar WHERE _varchar = ' a';
    SELECT * FROM tset_char_varchar WHERE _varchar = 'a ';
    SELECT * FROM tset_char_varchar WHERE _varchar = ' a ';
    

    具体图片不做赘述,这里每一条都只能查到唯一一条数据。


    【结论】:char方式插入,右边有空格会自动过滤掉!!

    另附常用字符集

    以一个字符为例:

    字符编码英文字母(单位:byte)中文汉字(单位:byte)
    ISO-8859-111
    GB231212
    GBK12
    UTF-813
    UTF-1644

    UTF-8字符编码的优势非常明显, 英文和数字(也就是ASCII字符集)只用一个byte, 而欧洲语言比如希腊语的字符占用2个byte,中文占用3个byte(超大字符集汉字占4个byte)。为了世界通用,所以后来像tomcat 8.x IDE等该用utf-8作为默认编码,也可以显示中文字符。

    参考

    Mysql中char和varchar的区别:https://blog.csdn.net/albertsh/article/details/97501893

    MySQL中varchar和char区别(转):https://www.cnblogs.com/webph/p/6679815.html

    MySQL的char和varchar针对空格的处理:https://www.cnblogs.com/dsitn/p/7346761.html

    展开全文
  • 你真的知道CHAR和VARCHAR类型在存储读取时的区别吗? 还是先抛几条结论吧: 1、存储的时候,CHAR总是会补足空格后再存储,不管用户插入数据时尾部有没有包含空格。 2、存储的时候,VARCHAR不会先补足空格后再存储...
  • 在MySQL中,charvarchar和text类型的字段都可以用来存储字符类型的数据,charvarchar都可以指定最大的字符长度,但text不可以。 它们的存储方式数据的检索方式也都不一样。 数据的检索效率是:char > varchar ...
  • Mysql中char和varchar区别

    千次阅读 多人点赞 2019-07-27 12:29:54
    文章目录前言问题起因length char_length测试环境测试过程char和varchar区别总结 前言 这个标题起的过于俗套,前一段时间我还写了一篇总结《Mysql5.7版本中数据表字段可用的类型》来批判这种对比,原因是对比时...

    前言

    这个标题起的过于俗套,前一段时间我还写了一篇总结《Mysql5.7版本中数据表字段可用的类型》来批判这种对比,原因是对比时没有指明数据库,内容写的是charvarcharnvarchar的对比,结果我测试了半天发现Mysql当前版本根本没有nvarchar,浪费来了不少时间。

    问题起因

    真香定律来的总是这么快,这才过了几天,我也来写写Mysql中charvarchar究竟有什么区别,起因是看到CSDN好友“铁柱同学”一篇关于innodb主键长度最大为767字节的讲解,里面涉及到一个char类型最大存储255个字符,按照utf8编码来看最大的字节数应该是255*3=765个字节的知识点。现在来看767的来源好像并不是256*3-1,而是255*3+2,这个2就是存储char类型字段中实际有多少个字节的。

    有点跑题了,实际上是在研究索引长度的过程中,我发现我对charvarchar这两个类型一直存在着误解,因为一直做游戏开发的缘故,游戏数据的存储一般使用varbinary来存,导致我把字符和字节有点弄混了,所以我一直认为在utf8编码下char(9)可以存储9个英文字符,或者3个中文汉字,实际我做完实验后发现char(9)也可以正常存储9个汉字。

    提到字符和字节,初学者可能会有点蒙,实际上它们两者之间是需要通过编码来转换的,之前做过游戏的多语言版本,所以对这一块还是比较熟的,字节就是计算机中的8个二进制位,而字符是每个语言中的不可分割的单元,字符转换成字节需要依赖编码,实际上编码就是一本大字典,里面对应了每个字符在当前编码下转换成字节是什么样的,ANSI是一本字典,UTF8也是一本字典,编码的类型还有很多,每种编码都记录了各自的转换结果。

    举个例子,“中”这个字是汉字中的一个字符,在ANSI这本字典中对应的是2个字节,而在UTF8这本字典中对应的是3个字节,而C这个字母是英文中的一个字符,在ANSI这本字典中对应的是1个字节,而在UTF8这本字典中对应的同样是1个字节,从这个例子中可以简单理解下字节与字符的关系。

    多说一句,不要认为UTF8编码中汉字转换成字节都是3个字节,实际情况是常用字一般都占用了3个字节,但是中国语言博大精深,光语言平面就单独占了好几个,有些汉字转换成UTF8编码可能需要4个字节,5个字节甚至是6个字节,这一点不要形成思维定式,认为汉字在UTF8编码下都是3个字节。

    length 和 char_length

    今天之前我是不知道Mysql还有一个char_length函数的,发现这个函数后越发感觉Mysql的强大,这两个函数的区别就是length用来统计字段中的字节数,char_length用来统计字段中的字符数,接下来我们用一个例子来看看这两个函数以及charvarchar的区别。

    测试环境

    Windows 10
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 5.7.21-log MySQL Community Server (GPL)
    Copyright © 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
    Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

    测试过程

    1. 首先创建一个带有charvarchar类型的测试表,查看表结构发现编码为utf8
    mysql> create table diff(id int, s1 char(10), s2 varchar(10));
    Query OK, 0 rows affected (0.07 sec)
    
    mysql> show create table diff;
    +-------+------------------------------------------------------------------------+
    | Table | Create Table                                                           |
    +-------+------------------------------------------------------------------------+
    | diff  | CREATE TABLE `diff` (
      `id` int(11) DEFAULT NULL,
      `s1` char(10) DEFAULT NULL,
      `s2` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+------------------------------------------------------------------------+
    1 row in set (0.07 sec)
    
    1. 插入少于10个字符的测试数据,然后查看结果,发现字节数为10,字符数为6
    mysql> insert into diff values(1, "测试test", "测试test");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select id, s1, length(s1), char_length(s1), s2, length(s2), char_length(s2) from diff;
    +----+----------+------------+-----------------+----------+------------+-----------------+
    | id | s1       | length(s1) | char_length(s1) | s2       | length(s2) | char_length(s2) |
    +----+----------+------------+-----------------+----------+------------+-----------------+
    |  1 | 测试test  |         10 |               6 | 测试test |         10 |               6 |
    +----+----------+------------+-----------------+----------+------------+-----------------+
    1 row in set (0.06 sec)
    
    1. 增加插入长度后发现,可以超过10个字节,可以完整存储10个汉字
    mysql> insert into diff values(2, "测试策划和开发做游戏", "测试策划和开发做游戏");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select id, s1, length(s1), char_length(s1), s2, length(s2), char_length(s2) from diff;
    +----+----------------------+------------+-----------------+----------------------+------------+-----------------+
    | id | s1                   | length(s1) | char_length(s1) | s2                   | length(s2) | char_length(s2) |
    +----+----------------------+------------+-----------------+----------------------+------------+-----------------+
    |  1 | 测试test             |         10 |               6 | 测试test              |         10 |               6 |
    |  2 | 测试策划和开发做游戏    |         30 |              10 | 测试策划和开发做游戏     |         30 |              10 |
    +----+----------------------+------------+-----------------+----------------------+------------+-----------------+
    2 rows in set (0.10 sec)
    
    1. 分别增加s1和s2字段长度后发现,均无法正常插入,Mysql给出报错信息
    mysql> insert into diff values(2, "测试策划和开发做游戏OK", "测试策划和开发做游戏");
    1406 - Data too long for column 's1' at row 1
    mysql> insert into diff values(2, "测试策划和开发做游戏", "测试策划和开发做游戏OK");
    1406 - Data too long for column 's2' at row 1
    mysql>
    
    1. 至此没有看出区别,在插入内容前后都加上空格测试一下
    mysql> select id, s1, concat('#', s1, '$'), length(s1) as len_s1, char_length(s1) as clen_s1,
                    s2, concat('#', s2, '$'), length(s2) as len_s2, char_length(s2) as clen_s2 from diff;
    +----+----------------------+------------------------+--------+---------+----------------------+------------------------+--------+---------+
    | id | s1                   | concat('#', s1, '$')   | len_s1 | clen_s1 | s2                   | concat('#', s2, '$')   | len_s2 | clen_s2 |
    +----+----------------------+------------------------+--------+---------+----------------------+------------------------+--------+---------+
    |  1 | 测试test              | #测试test$             |     10 |       6 | 测试test              | #测试test$             |     10 |       6 |
    |  2 | 测试策划和开发做游戏     | #测试策划和开发做游戏$    |     30 |      10 | 测试策划和开发做游戏    | #测试策划和开发做游戏$     |     30 |      10 |
    |  3 |  OK                  | # OK$                  |      3 |       3 |  OK                  | # OK $                 |      4 |       4 |
    +----+----------------------+------------------------+--------+---------+----------------------+------------------------+--------+---------+
    
    

    这一次出现了区别,char类型的字段去掉了尾部的空格,而varcahr了类型的字段原样存储,没有去掉尾部空格,两者对于头部的空格都是存储的,这导致两者显示的字节数和字符数都不相同了。

    1. 分别使用不带空格、带头部空格,头尾都带空格进行测试
    mysql> select * from diff where s1 = 'OK ';
    Empty set
    
    mysql> select * from diff where s2 = 'OK ';
    Empty set
    
    mysql> select * from diff where s1 = ' OK ';
    +----+-----+------+
    | id | s1  | s2   |
    +----+-----+------+
    |  3 |  OK |  OK  |
    +----+-----+------+
    1 row in set (0.05 sec)
    
    mysql> select * from diff where s2 = ' OK ';
    +----+-----+------+
    | id | s1  | s2   |
    +----+-----+------+
    |  3 |  OK |  OK  |
    +----+-----+------+
    1 row in set (0.05 sec)
    
    mysql> select * from diff where s1 = ' OK';
    +----+-----+------+
    | id | s1  | s2   |
    +----+-----+------+
    |  3 |  OK |  OK  |
    +----+-----+------+
    1 row in set (0.05 sec)
    
    mysql> select * from diff where s2 = ' OK';
    +----+-----+------+
    | id | s1  | s2   |
    +----+-----+------+
    |  3 |  OK |  OK  |
    +----+-----+------+
    1 row in set (0.04 sec)
    

    测试结果可能让人出乎意料,虽然s1和s2中存储的内容不同(差一个空格),但是查找时的行为却完全一样,这说明查找时尾部的空格并不会被考虑。

    char和varchar区别

    做了半天试验发现char和varchar还是没有多大区别,实际上有些区别通过表面数据是测试不出来的,具体区别整理如下:

    行为char字段varchar字段
    最大长度255字符65535个字节,所以括号中最大的字符数还得通过编码来算
    是否定长定长,不足的部分用隐藏空格填充不定长
    空间使用会有浪费更加节省
    查找效率
    尾部空格插入时省略插入时不会省略,查找时省略
    like查找语句中like后的’ '不会省语句中like后的’ '不会省,字段结尾的空格也不会省

    总结

    1. char(n)中的n是字符数,范围是0~255(额外需要1到2个字节来存长度)
    2. varchar(n)中的n也是字符数,但是最大值需要通过编码来算,不能超过65535字节(从中还需要拿出1到2个字节来存长度)
    3. 一般定长的数据选用char类型,比如身份证号,手机号,电话等,长度变化很大的可以使用varchar类型
    4. 注意尾部空格的匹配,特别是插入时和使用like查找时
    展开全文
  • MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255,其数据范围可以是0~255
  • NULL 博文链接:https://wy649898543.iteye.com/blog/1446712
  • char和varchar区别

    千次阅读 2021-03-16 23:32:44
    char类型的长度是固定的,varchar的长度是可变的。

    1. char类型的长度是固定的,varchar的长度是可变的。

    char类型时定长的类型,即当定义的是char(10),输入的是"abc"这三个字符时,它们占的空间一样是10个字节,包括7个空字节。当输入的字符长度超过指定的数时,char会截取超出的字符。而且,当存储char值时,MySQL是自动删除输入字符串末尾的空格。

    char是适合存储很短的、一般固定长度的字符串。例如,char非常适合存储密码的MD5值,因为这是一个定长的值。对于非常短的列,char比varchar在存储空间上也更有效率。

    varchar(n)类型用于存储可变长的,长度为n个字节的可变长度且非Unicode的字符数据。n必须是介于1和8000之间的数值,存储大小为输入数据的字节的实际长度+1/2. 比如varchar(10), 然后输入abc三个字符,那么实际存储大小为3个字节。除此之外,varchar还需要使用1或2个额外字节记录字符串的长度,如果列的最大长度小于等于255字节(是定义的最长长度,不是实际长度),则使用1个字节表示长度,否则使用2个字节来表示。

    二:效率不同

    1、char类型:char类型每次修改的数据长度相同,效率更高。

    2、varchar类型:varchar类型每次修改的数据长度不同,效率更低。

    三、存储不同

    1、char类型:char类型存储的时候是初始预计字符串再加上一个记录字符串长度的字节,占用空间较大。

    2、varchar类型:varchar类型存储的时候是实际字符串再加上一个记录字符串长度的字节,占用空间较小。

    展开全文
  • charvarchar区别 char (13)长度固定, 如’www.jb51.net’ 存储需要空间 12个字符 varchar(13) 可变长 如’www.jb51.net’ 需要存储空间 13字符, 从上面可以看得出来char 长度是固定的,不管你存储的数据是多少...
  • char和varchar区别及踩坑 char与varchar2都是Oracle的数据存储格式。 char是定长的,varchar2是变长。都可以存储字符串。 同样存储一个字符“a” char:占用了10个字符(a占一个,另外9个使用空格占用) varchar2 只占用...
  • 一、区别 1、最大长度: char最大长度是255字符,varchar最大长度是65535个字节。 2、定长: char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。 3、空间使用: char会浪费空间,varchar会更加节省...
  • char和varchar区别

    千次阅读 2018-04-03 14:39:01
    一 char和varchar有什么区别?1.char的长度是固定的,而varchar的长度是可以变化的。 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用...
  • charvarchar区别

    2021-06-23 11:45:19
    CHAR是一种固定长度的类型,而VARCHAR则是一种可变长度的类型。 在CHAR(M)类型的数据列内,每个值要占M个字节,若小于M,则MySQL会在它的右边用空格来补足,但在查询时,这些空格会被去掉。 在VARCHAR(M)类型的数据...
  • 我们在定义数据库创建一个string字段时,经常分不清char和varchar,不知道他们俩有什么区别,其实是很好区分的。 首先我们来说一说charchar是不可变得,也就是固定长度,假如定义一个char(8),varchar(8),如果输入...
  • 数据库中charvarchar区别

    千次阅读 2022-03-10 16:59:37
    1.char类型的长度是固定的,varchar的长度是可变的。 2. char类型的效率比varchar的效率稍高。 3.底层存储方式不同,char的存储方式是:对英文字符(ASCII)占用一个字节,对一个汉字占用两个字节;而varchar的...
  • MySQL中的字符串有两个常用的类型:char和varchar,二者各有优势,下面我们来详细分析一下。 通常在建表的时候对于String 类型的数据定义我们或许会很纠结 : 什么时候用char 什么时候用 varchar 呢? 首先可以...
  • char varchar区别是什么? char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。 chat 优点:效率高;缺点:占用空间;适用场景:存储...
  • char和varchar区别 varchar的长度是可变的,char的长度不可变。 获取数据时,char需要使用trim()方法去空格,但是varchar不需要。 存储时,char类型的数据要比varchar类型的数据更快。因为其长度固定,方便存储于...
  • mysql中charvarchar区别

    千次阅读 2019-10-17 09:30:15
    在mySQL 中char varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。 char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足...
  • 在mySQL 中char varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。 1.存储区别char(len)括号中存储写的是字符长度,最大值为255,如果在存储的时你实际存储的字符...
  • 数据库中char和varchar区别

    千次阅读 2018-03-16 12:38:50
    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10只是最大值...
  • VARCHAR和CHAR是两种最主要的字符串类型。它们的存储方式数据检索方式都不一样。VARCHAR和CHAR的数据检索效率:CHAR > VARCHARVARCHAR类型VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。它比定...
  • charvarchar区别char(100)类型的字段一旦定义,不管里面是否有值,固定占用100个字符对应的存储空间,这种对空间的利用率其实并不高,但是效率较快。varchar(100)类型的字段定义后,它所占用的空间就是里面...
  • 在本篇文章中我们给大家分享了关于MySQL中int、char以及varchar的性能对比的相关内容,有兴趣的朋友们学习下。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 276,275
精华内容 110,510
关键字:

char和varchar区别

友情链接: CJKAnalyzer.rar