文章目录
一、CHAR 类型和 VARCHAR 类型
CHAR类型和VARCHAR类型都在创建表时指定了最大长度,其基本形式如下:
1.字符串字符(M)
其中,“字符串类型”参数指定了数据类型为CHAR类型还是VARCHAR类型;M参数指定了该字符串的最大长度为M。例如,CHAR(4)就是数据类型为CHAR类型,其最大长度为4。
CHAR类型的长度是固定的,在创建表时就指定了。其长度可以是0~255的任意值。例如,CHAR(100)就是指定CHAR类型的长度为100。CHAR 存储值时,它们会用空格右填充到指定的长度。
VARCHAR类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取0~65535之间的任意值。指定VARCHAR类型的最大值以后,其长度可以在0到最大长度之间。例如,VARCHAR(100)的最大长度是100,但是不是每条记录都要占用100个字节,而是在这个最大值范围内使用多少就分配多少。VARCHAR类型实际占用的空间为字符串的实际长度加1或2,这样即可有效节约系统的空间。
值 | CHAR(4) | 存储字节数 | VARCHAR(4) | 存储字节数 |
‘’ | ‘’ | 4 | ‘’ | 1 |
‘ab’ | ‘ab’ | 4 | ‘ab’ | 3 |
‘abcd’ | ‘abcd’ | 4 | ‘abcd’ | 5 |
‘abcdefgh’ | - | #插入失败 | - | #插入失败 |
mysql> use test; #选择数据库test mysql> create table char_example(e_char char(5), v_char varchar(5)); #创建数据库表 mysql> insert into char_example values('12345','12345'); #正常插入数据 mysql> insert into char_example values('1 2 ','1 2 '); #char类型会屏蔽后面隐藏的空格,varchar 不会 mysql>select concat('(',e_char, ')'), concat('(',v_char, ')') from char_example ; #让char 后面屏蔽的空格原型毕露 |
2.实战类型
- 1、 char一定会使用指定的空间,varchar是根据数据来定空间
- 2、 char的数据查询效率比varchar高:varchar是需要通过后面的记录数来计算
- 3、 如果确定数据一定是占指定长度,那么使用char类型;
- 4、 如果不确定数据到底有多少,那么使用varchar类型;
- 5、 如果数据长度超过255个字符而在65535之内,直接使用varchar
- 6、 如果字符串尾部要保留空格,必须选择varchar
二、TEXT 类型
1.类型表
TEXT类型是一种特殊的字符串类型,包括TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,其长度和存储空间的对比下表所示:
各种TEXT类型的区别在于允许的长度和存储空间不同。因此,在这几种TEXT类型中,根据需求选取既能满足需要又节省空间的类型即可。
2.特别注意
1)以上各类型无须指定长度!
2)允许的长度是指实际存储的字节数,而不是实际的字符个数,比如假设一个中文字符占两个字节, 那么TEXT 类型可存储 65535/2 = 32767 个中文字符,而varchar(100)可存储100个中文字 符,实际占200个字节,但varchar(65535) 并不能存储65535个中文字符,因为已超出表达范围。
mysql> use test; #选择数据库test mysql> create table text_example(e_text tinytext, v_char varchar(255)); #创建数据库表,e_text 可存储255个字节,v_char可存储255个字符 mysql> insert into char_example values(90个中文字符,90个中文字符); #插入失败,utfmb4 用3个字节表示一个中文汉字,会超出tinytext 保存范围 mysql> insert into char_example values(80个中文字符,100个中文字符); #插入成功 |
3.实战建议
- 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。超过255字节的只能用varchar或者text;
- 2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
- 3、 text不设置长度, 当不知道属性的最大长度时,适合用text, 能用varchar的地方不用text;
- 4、 如果都可以选择,按照查询速度: char最快, varchar次之,text最慢。
4.实战练习
创建一个用户信息表,用来存储用户的如下信息:姓名,手机号码,家庭地址,个人简介,性别,年龄,身份证号。数据库表名可定义为userinfo, 同时增加一个列id 用来作为每一条记录的唯一标识,并设为主键,自加!
mysql> use test; #选择数据库test mysql> create table userinfo ( id int(11) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘主键’, name varchar(64) DEFAULT NULL COMMENT ‘姓名’, mobile char(11) DEFAULT NULL COMMENT ‘手机号码’, address varchar(128) DEFAULT NULL COMMENT ‘居住地址’, description text DEFAULT NULL COMMENT ‘个人简介-不知道具体的范围,不常更新用text’, sex char(1) DEFAULT NULL COMMENT ‘性别 - 男或女’, age tinyint unsigned DEFAULT 0 COMMENT ‘年龄’, idno char(18) DEFAULT NULL COMENT ‘身份证号码’ ); |
三、ENUM 和 SET 类型
1.ENUM类型
ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定,其基本形式如下:
属性名 ENUM('值1', '值2', …, '值n')
其中,“属性名”参数指字段的名称,“值n”参数表示列表中的第n个值。ENUM类型的值只能取列表中的一个元素。其取值列表中最多能有65535个值。如果数据值列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。列表中的每个值独有一个顺序排列的编号,MySQL中存入的是这个编号,而不是列表中的值。默认编号从1开始!
Enum(‘男’,’女’,‘选择保密’) # ‘男’=>1 ‘女’=>2 ‘选择保密’=> 3
mysql> use test; #选择数据库test mysql> create table enum_example (e_enum enum('男','女','选择保密') ); #创建表 mysql> insert into enum_example values('男'); #插入记录,必须是enum 选项中的值 mysql> insert into enum_example values(1); #插入记录可以用数值表示 mysql>select e_enum + 0 from enum_example; #查询enum 选项对应的整数值 |
如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个元素。如果不加NOT NULL属性,ENUM类型将允许插入NULL,而且NULL为默认值。
2.SET类型
在创建表时,SET类型的取值范围就以列表的形式指定了,其基本形式如下:
属性名 SET('值1', '值2', …, '值n')
其中,属性名参数指字段的名称,“值n”参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与ENUM类型一样。SET类型的值可以取列表中的一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是由64个元素构成的组合。
mysql> use test; #选择数据库test mysql> create table set_example (interest set('足球','追剧','篮球','撩妹') ); #创建表 mysql> insert into set_example values( '足球,撩妹' ); #插入记录,必须是enum 选项中的值 mysql> insert into enum_example values(9); #插入相应位效果等同,9 =>1001 选择1,4 mysql>select interest+0 from set_example; #以整数的方式查询 |
总结
- char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。超过255字节的只能用varchar或者text;
- 2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
- 3、 text不设置长度, 当不知道属性的最大长度时,适合用text, 能用varchar的地方不用text;
- 4、 如果都可以选择,按照查询速度: char最快, varchar次之,text最慢。