MySQL字符串类型:
CHAR类型:
CHAR类型的字符串为定长.长度范围是0到255之间的任何值.占用定长的存储空间,不足的部分用==空格==填充;读取时删掉后面的空格。
例子:
password char(32)
mobile char(11)
name char(10)
存储空间:
CHAR(==M==)类型的存储空间和字符集有关系,一个中文在utf8字符集中占用3个bytes、gbk占用2个bytes、数字和字符统一用一个字符表示。
存储机制:
在不够M长度时,MySQL在存储数据时,需要填充特殊的空格。
举例说明:
字段名称 CHAR(M) , M 表示字符数。
应用场景:
CHAR比较适合存储确定的固定长度的字符串。
加密后的密码 => char(32),手机号码mobile(11),身份证号码等等。
案例:创建一个tb_admin数据表,定义字段(id、username、password)
mysql> create table tb_admin (
-> id tinyint unsigned not null auto_increment,
-> username varchar(20),
-> password char(32),
-> primary key(id)
-> )engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> desc tb_admin;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | YES | | NULL | |
| password | char(32) | YES | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> insert into tb_admin values(null,'admin',md5('admin888'));
Query OK, 1 row affected (0.00 sec)
mysql> select * from tb_admin;
+----+----------+----------------------------------+
| id | username | password |
+----+----------+----------------------------------+
| 1 | admin | 7fef6171469e80d32c0559f88b377245 |
+----+----------+----------------------------------+
1 row in set (0.00 sec)
MD5是内置的加密函数。
VARCHAR类型:
VARCHAR是变长存储,仅使用必要的存储空间。
name varchar(10) 根据你要插入的内容决定你的存储空间。
存储空间:
VARCHAR(M)类型的存储空间和字符集有关系,一个中文在utf8字符集中占用3个bytes、gbk占用2个bytes、数字和字符统一用一个字符表示。
存储机制:
VARCHAR(M)字段存储实际是从第二个字节开始存储,然后用1到2个字节表示实际长度,剩下的才是可以存储数据的范围,因此最大可用存储范围是65535-3=65532字节;
第一个字节标识是否为空.(长度小于255字节,使用一个字节来表示长度;大于255字节使用两个字节来表示长度)。
应用场景:主要适合存储长度不固定的字符串信息,如用户名称、产品标题、新闻标题、新闻描述(不超过255个字符)
案例:
案例:创建一个tb_news数据表,定义字段(id、title、description、addtime)
mysql> create table tb_news (
-> id int unsigned not null auto_increment,
-> title varchar(80),
-> description varchar(255),
-> addtime date,
-> primary key(id)
-> )engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> desc tb_news;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(80) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| addtime | date | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
char(10)
varchar(10)
char在读取速度上要快点,varchar在存储空间上有优势。
TEXT类型:
TEXT代表文本类型的数据,当我们使用VARCHAR类型存储数据时(早期最大只能存储255个字符,MySQL5版本中,其gbk可以存储3万多个字符,utf8格式可以存储2万多个字符),如超过了VARCHAR的最大存储范围,则可以考虑使用TEXT文本类型。
经验之谈:255个字符以内(包括),定长就使用CHAR类型,变长就使用VARCHAR类型,如果超过255个字符,则使用TEXT文本类型。
应用场景:文本内容、产品的详细介绍等等。
案例:创建一个tb_goods产品表,定义字段(id、name、price、content)
mysql> create table tb_goods (
-> id int unsigned not null auto_increment,
-> name varchar(80),
-> price decimal(11,2),
-> content text,
-> primary key(id)
-> )engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> desc tb_goods;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(80) | YES | | NULL | |
| price | decimal(11,2) | YES | | NULL | |
| content | text | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
其他类型:
BLOB:保存二进制的大型数据(字节串),没有字符集,eg:图片、音频视频等。
实际运维工作中,很少将文件直接保存在数据库端,一般文件的存储都是基于路径进行操作的。
ENUM枚举类型:多选一,从给定的多个选项中选择一个,如gender enum('男','女','保密')
SET集合类型:多选多,从给定的多个选项中选个多个,如hobby set('吃饭','睡觉','打豆豆')