MySql之char与varchar

MySql之char与varchar的区别

char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:

1. char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)

在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

2.char的效率比varchar2的效率稍高。

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

  何时该用char,何时该用varchar2?

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

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

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

下面是在mysql中的实验证明:

mysql> #tee 将命令框中的内容输入到指定文件

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| db1                |

| mysql              |

| performance_schema |

| student            |

| test               |

+--------------------+

6 rows in set (0.02 sec)

mysql> use student;

Database changed

mysql> show tables;

+-------------------+

| Tables_in_student |

+-------------------+

| infotb            |

+-------------------+

1 row in set (0.00 sec)

mysql> desc infotb;

+-------+-------------+------+-----+---------+----------------+

| Field | Type        | Null | Key | Default | Extra          |

+-------+-------------+------+-----+---------+----------------+

| id    | tinyint(4)  | NO   | PRI | NULL    | auto_increment |

| name  | varchar(20) | NO   |     | NULL    |                |

| sex   | varchar(5)  | YES  |     | NULL    |                |

| tel   | varchar(20) | YES  |     | NULL    |                |

| ad    | varchar(30) | YES  |     | NULL    |                |

+-------+-------------+------+-----+---------+----------------+

5 rows in set (0.00 sec)

mysql> select * from infotb;

+----+----------+------+-------------+----------------+

| id | name     | sex  | tel         | ad             |

+----+----------+------+-------------+----------------+

| 13 | cyz      | NULL | 123         | 123            |

| 15 | cool     | NULL | cool        | cool           |

| 16 | this     | NULL | is          | great          |

| 17 | 哈喽     | NULL | NULL        | NULL           |

| 22 | QQ群     | NULL | 111         | 河南           |

| 24 | 123      | NULL | 123         | 123            |

| 26 | 哈哈哈哈 | NULL | 123123      | 阿斯顿         |

| 27 | tom      | NULL | 123         | NULL           |

| 28 | tom2     | NULL | 1233        | NULL           |

| 29 | tom      | NULL | 123         | NULL           |

| 30 | tom2     | NULL | 1233        | NULL           |

| 31 | tom      | NULL | 123         | NULL           |

| 32 | tom2     | NULL | 1233        | NULL           |

+----+----------+------+-------------+----------------+

22 rows in set (0.01 sec)

mysql> create table test (

-> ca char(4) not null defalut ‘‘,

-> vca varchar(4) not null defalut ‘‘

-> );

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘defalut ‘‘,

vca varchar(4) not null defalut ‘‘

)‘ at line 2

mysql> create table test (

-> ca char(4) not null default ‘‘,

-> vca varchar(4) not null default ‘‘

-> );

Query OK, 0 rows affected (0.22 sec)

mysql> #练习char与varchar的区别

mysql> insert into test(ca,vca) value(‘aa ‘,‘aa ‘);

Query OK, 1 row affected (0.09 sec)

mysql> select * from test;

+----+-----+

| ca | vca |

+----+-----+

| aa | aa  |

+----+-----+

1 row in set (0.00 sec)

mysql> #concat 连接字符串函数

mysql> select concat(ca,‘!‘),concat(vca,‘!‘) from test;

+----------------+-----------------+

| concat(ca,‘!‘) | concat(vca,‘!‘) |

+----------------+-----------------+

| aa!            | aa !            |

+----------------+-----------------+

1 row in set (0.18 sec)

mysql> #char和varchar分别称为定长和变长类型

mysql> #对于char(N),不够N个长度,用空格在尾部补够N个长度,浪费了尾部。

mysql> #而对于varchar(N),不用空格补齐,但在列内容前,有1-2个字节来标志该列的内容长度。

mysql> #char读取速度比较快,但浪费存储空间,末尾有空格的字符串读取时,空格读不出来

mysql> #varchar读取速度没有char快,但充分利用存储空间,能够存储任意字符。

mysql> exit;

#tee 将命令框中的内容输入到指定文件

时间: 2024-10-13 20:57:10

MySql之char与varchar的相关文章

MySQL中char和varchar有啥区别?优缺点是啥?

在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 char (13)长度固定, 如'www.jb51.net' 存储需要空间 12个字符: varchar(13) 可变长 如'www.jb51.net' 需要存储空间 13字符:从上面可以看得出来char 长度是固定的,不管你存储的数据是多少他都会都固定的长度.而varchar则处可变长度但他要在总长

mysql中char与varchar的区别分析

原文网址:http://www.jb51.net/article/23575.htm mysql中char与varchar的区别分析 作者: 字体:[增加 减小] 类型:转载 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 char (13)长度固定, 如'www.jb51.net' 存储需要空间 12个字符 varchar(13) 可变长 如'w

浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来.后来,在网上找了下网友总结的区别.在这里做个备忘录: 一,SQL Server中char,varchar,nchar,nvarchar的区别(援引:https://www.cnblogs.com/limeiky/p/5313312.html) 1,定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不

MYSQL, char 与 varchar的区别!

一.char 和 varchar 的区别: 1)取值范围: char:取值范围:0~255 varchar:取值范围:0~65535 2)空间占用与速度: char: 定长字符串,占用空间大,速度快,一般用于固定长度的表单提交数据存储,例如:身份账号.电话号码.密码等 varchar:变长字符串,占用空间小,速度慢 3)存储与检索数据: char:存储的数据是否达到了给定值得字节,都要占用给定值大小的空间,不足的自动用空格填充,在检索时后面的空格会被自动去裁剪掉. 如:定义  tel char(

mysql中char,varchar与text类型的区别和选用

关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... text . char.varchar  是数据在数据库中的存放策略问题,为了,合理应用存储空间,是数据库服务器数据类型划分的方式.对于应用程序,把它们和string对应就可以了. 于是去查阅了一些资料,顺便将这三种类型做个比较: (1)char:  char不用多说了,它是定长格式的,但是长度范围是0~255.

MySQL中char与varchar数据类型选择原则

很多地方在分析char与varchar数据类型选择原则上,往往忽略了存储引擎.事实上,我们应当根据选定的存储引擎,确定如何选择合适的数据类型. char与varchar比较 值 char(3) 实际存储字符长度 varchar(3) 实际存储字符长度 " ' ' 3 " 1 'ab' 'ab ' 3 'ab' 3 'abc' 'abc' 3 'abc' 4 'abcdefg' 'abc' 3 'abc' 4 总结:从上表可以看出,char属于定长的. char属于定长类型,varcha

mysql关于char和varchar的查询效率问题

看了好多资料都说 varchar(size) 可变长度的字符值,节省空间,查询效率低 char(size) 固定长度的字符值,浪费空间,查询效率高 但是实际测试  char(100)   varchar(100)   300W条数据 从查询方面的角度来说,还是varchar毕竟靠谱 查询效率(在没有使用索引的情况下):   varchar的字段查询要比char快 通过对比  char100 需要查询时间1.10s   而varchar100 需要时间是973ms  欢迎大家指正!! 原文地址:h

mysql中char和varchar类型的区别

区别: char:存储的数据时固定长度的: varchar:存储的数据可变长度 举例: 在数据表中定义两个数据项char(200)和varchar(200),同时存入字符串串"Hello Word", char类型便会用这200多的数据长度存储这十几个字符,简直很汗!: varchar类型会按需索取,只会用这十几个字符需要的空间来存储它,再加上一个位置来存储位置信息,嗯,好多了. 注意: 1.这样看起来varchar比char好多了,char有优点吗? 当然有的!!! char类型因为

Mysql 中 char 、varchar 、text的区别

首先它们的存储方式和数据的检索方式都不一样.数据的检索效率是:char > varchar > text 空间占用方面,就要具体情况具体分析了. char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格. varchar:存储变长数据,但存储效率没有C