MySQL最佳入门 - MySQL数据类型之字符串类型以及TEXT类型

本篇文章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 占用空间最少,但是要注意它的特性;
  • 根据性能,空间的占用,和具体的需要来选择类型。

总结

  • 定义数据类型就是在定义列,数据类型决定数据的特性;
  • 数据类型主要分为字符串类型,整数类型,浮点和定点类型,日期类型以及二进制类型;
  • 根据类型在不同的存储引擎上表现和处理都不同;
  • 根据所采用的数据类型,需求和数据特点选择数据类型。
发布了178 篇原创文章 · 获赞 132 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/Soinice/article/details/96374336