本篇文章MySQL版本:
+-----------+
| version() |
+-----------+
| 5.5.53 |
+-----------+
字符串类型
- 字符串类型是一个统称,包含多种不同的数据类型;
- 分为文本字符串类型和二进制字符串类型;
- 不仅可以存储字符串,还可以存储其他类型;
- 字符串可以区分或不区分大小写的串比较;
- 支持进行模式匹配查找;
CHAR(M)
定长字符串,M,定义字符串的长度,最大值255;定长指定长度之后不变,M就为占用字符;
VARCHAE(M)
可变字符串,字符长度多少,占用多少字符;
创建表
mysql> create table t_char( col1 char(4), col2 varchar(4));
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_char;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| col1 | char(4) | YES | | NULL | |
| col2 | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
正常操作
插入两条数据,同样的数据:
mysql> insert into t_char values('ab ','ab ');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from t_char;
+------+------+
| col1 | col2 |
+------+------+
| ab | ab |
+------+------+
1 row in set (0.00 sec)
连接字符串(合并)
mysql> select concat(col1,'!'),concat(col2,'!') from t_char;
+------------------+------------------+
| concat(col1,'!') | concat(col2,'!') |
+------------------+------------------+
| ab! | ab ! |
+------------------+------------------+
1 row in set (0.00 sec)
char 已经有ab然后空格占位,加入感叹号,则去掉占位空格。
显示长度
mysql> insert into t_char values('abcd','abcd');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t_char;
+------+------+
| col1 | col2 |
+------+------+
| ab | ab |
| abcd | abcd |
+------+------+
2 rows in set (0.00 sec)
大于存储长度
mysql> insert into t_char values('abcdef','abcdef');
Query OK, 1 row affected, 2 warnings (0.01 sec)
mysql> select * from t_char;
+------+------+
| col1 | col2 |
+------+------+
| ab | ab |
| abcd | abcd |
| abcd | abcd |
+------+------+
3 rows in set (0.00 sec)
sql_mode
mysql> show variables like 'sql_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode | |
+---------------+-------+
1 row in set (0.00 sec)
大于 指定长度可以插入数据是因为 sql_mode value为空,决定的。5.5之后会被设置为 严格模式。
TEXT类型
- Text类型及其子类型用于存储比较长的非二进制字符串,比如:文章,评论等。
- Text可以认为是VARCHAR类型的加长增强版;
- Text类型不区分大小写。
创建表插入两条数据
mysql> create table t_text( col1 text );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_text;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1 | text | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.01 sec)
mysql> insert into t_text values ('full-stack'),('VX');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t_text;
+------------+
| col1 |
+------------+
| full-stack |
| VX |
+------------+
2 rows in set (0.00 sec)
模糊查询 %
mysql> select * from t_text where col1 like '%fu%';
+------------+
| col1 |
+------------+
| full-stack |
+------------+
1 row in set (0.00 sec)
ENUM类型
- ENUM类型存储的数据好比是单项选择题里的选项,其存储的值为表创建时在列规定中枚举的一列值;
- 比如 男 女,性别字段,可以加UM,但是不能有其他数值;
普通操作
mysql> create table t_enum(
-> id int ,
-> name varchar(10),
-> sex enum('F','M','UM')
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_enum;
+-------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| sex | enum('F','M','UM') | YES | | NULL | |
+-------+--------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
插入数据
mysql> insert into t_enum values (1,'soinice','F');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_enum;
+------+---------+------+
| id | name | sex |
+------+---------+------+
| 1 | soinice | F |
+------+---------+------+
1 row in set (0.00 sec)
不可插入空值,也不可插入 非 F M UN字符。
SET类型
- Set类型存储的数据好比是多项选择题里的选项,其存储的值为表创建时规定的一列值;
创建表
mysql> create table t_set( col1 set('a','b','c') );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_set
-> ;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| col1 | set('a','b','c') | YES | | NULL | |
+-------+------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
插入数据
mysql> insert into t_set values ('a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_set values ('ab');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t_set values ('a,b');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_set values ('a,b,c');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_set;
+-------+
| col1 |
+-------+
| a |
| |
| a,b |
| a,b,c |
+-------+
4 rows in set (0.00 sec)
只能插入指定好的值,非指定在内的值是插不进去的。
二进制类型
- 二进制类型及其子类型是用于存储二进制数据的类型;
- no character set;
- 以bytes 为单位存储,以bytes为单位比较。
选择合适的数据类型
字符串类型的选择
不同数据引擎,选项不同
MYISAM:
是一种非常适合读多写少,当读CHAR定长会比VARCHAR效率高,因为是定长的,效率会高;
Innodb:
相率方面,CHAR和VARCHAR效率相差不大,但是VARCHAR占用内存相对会比较好,根据具体长度来消耗存储空间;
MEMORY:
存放在内存中的数据引擎,VARCHAR更适合,因为会节省内存。读取效率差异,CHAR和VARCHAR几乎可以忽略,因为内存的IO效率,肯定比硬盘IO高。
不同用途,选择不同
CHAR:很短的字符,经常变更的内容;
VARCHAR:与上条相反。
浮点数和定点数的选择
- 精度要求不同,选择大不同;
- 相比较而言,定点数的计算代价要昂贵的多,一般用在和钱有关的地方;
大数据类型的选择
- 能不用尽量不用,TEXT和BLOG有很多替代选择,比如 静态化成一个个静态文件,通过数据记录文件位置,通过位置获取文件内容;
- 如果存在经常的删除和更新,建议定期使用optimize table 进行碎片整理;
- 电影可以用二进制进行存储,但是效率非常差,比如,从数据库取出二进制,然后组装成文件,再返回。
日期类型的选择
- TIMESTAMP 占用空间最少,但是要注意它的特性;
- 根据性能,空间的占用,和具体的需要来选择类型。
总结
- 定义数据类型就是在定义列,数据类型决定数据的特性;
- 数据类型主要分为字符串类型,整数类型,浮点和定点类型,日期类型以及二进制类型;
- 根据类型在不同的存储引擎上表现和处理都不同;
- 根据所采用的数据类型,需求和数据特点选择数据类型。