关于mysql:MySQL-中-blob-和-text-数据类型详解

前言:

后面文章咱们介绍过一些罕用数据类型的用法,比方 int、char、varchar 等。始终没具体介绍过 blob 及 text 类型,尽管这两类数据类型不太罕用,但在某些场景下还是会用到的。本篇文章将次要介绍 blob 及 text 数据类型的相干常识。

1. blob 类型

blob(binary large object) 是一个能够存储二进制文件的容器,次要用于存储二进制大对象,例如能够存储图片,音视频等文件。依照可存储容量大小不同来分类,blob 类型可分为以下四种:

类型 可存储大小 用处
TINYBLOB 0 – 255字节 短文本二进制字符串
BLOB 0 – 65KB 二进制字符串
MEDIUMBLOB 0 – 16MB 二进制模式的长文本数据
LONGBLOB 0 – 4GB 二进制模式的极大文本数据

其中最罕用的就是 blob 字段类型了,最多可存储 65KB 大小的数据,个别可用于存储图标或 logo 图片。不过数据库并不适宜间接存储图片,如果有大量存储图片的需要,请应用对象存储或文件存储,数据库中能够存储图片门路来调用。

2. text 类型

text 类型同 char、varchar 相似,都可用于存储字符串,个别状况下,遇到存储长文本字符串的需要时能够思考应用 text 类型。依照可存储大小辨别,text 类型同样可分为以下四种:

类型 可存储大小 用处
TINYTEXT 0 – 255字节 个别文本字符串
TEXT 0 – 65 535字节 长文本字符串
MEDIUMTEXT 0 – 16 772 150字节 较大文本数据
LONGTEXT 0 – 4 294 967 295字节 极大文本数据

不过在日常场景中,存储字符串还是尽量用 varchar ,只有要存储长文本数据时,能够应用 text 类型。比照 varchar ,text 类型有以下特点:

  • text 类型毋庸指定长度。
  • 若数据库未启用严格的 sqlmode ,当插入的值超过 text 列的最大长度时,则该值会被截断插入并生成正告。
  • text 类型字段不能有默认值。
  • varchar 可间接创立索引,text 字段创立索引要指定前多少个字符。
  • text 类型检索效率比 varchar 要低。

上面咱们来具体测试下 text 类型的应用办法:

# 创立测试表 字符集是 utf8
mysql> show create table tb_text\G
*************************** 1. row ***************************
       Table: tb_text
Create Table: CREATE TABLE `tb_text` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `a` tinytext,
  `b` text,
  `c` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

# 创立索引测试 发现text类型必须指定前缀长度
mysql> alter table tb_text add index idx_a (a);
ERROR 1170 (42000): BLOB/TEXT column 'a' used in key specification without a key length
mysql> alter table tb_text add index idx_b (b); 
ERROR 1170 (42000): BLOB/TEXT column 'b' used in key specification without a key length
mysql> alter table tb_text add index idx_c (c);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> alter table tb_text add index idx_b (b(10));
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 插入数据测试(repeat函数用于生成反复数据)
# 失常插入
mysql> insert into tb_text  (a,b,c) values (repeat('hello',3),repeat('hello',3),repeat('hello',3));
Query OK, 1 row affected (0.01 sec)
# 插入英文字符超标
mysql> insert into tb_text  (a) values (repeat('hello',52));
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'a' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)
# 插入中文超标
mysql>  insert into tb_text  (a) values (repeat('你好',100));
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'a' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)
# 查看数据 发现数据有所截取 tinytext 类型最多存储255字节数据
mysql> select * from tb_text;
+----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+
| id | a                                                                                                                                                                                                                                                               | b               | c               |
+----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+
|  1 | hellohellohello                                                                                                                                                                                                                                                 | hellohellohello | hellohellohello |
|  2 | hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello | NULL            | NULL            |
|  3 | 你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你                                                                                      | NULL            | NULL            |
+----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+
3 rows in set (0.00 sec)

通过以上测试,咱们留神到,text 类型可存储容量是以字节为单位而不是字符。例如 tinytext 最多存储 255 个字节而不是 255 个字符,在 utf8 字符集下,一个英文字母或数字占用一个字节,而一个中文汉字占用三个字节。也就是说 tinytext 最多存储 255/3=85 个汉字,text 最多存储 65535/3=21845 个汉字。而 varchar(M) 中的 M 指的是字符数,一个英文、数字、汉字都是占用一个字符,即 tinytext 可存储的大小并不比 varchar(255) 多。

总结:

本篇文章介绍了 blob 及 text 字段类型相干常识。尽管数据库标准中个别不举荐应用 blob 及 text 类型,但因为一些历史遗留问题或是某些场景下,还是会用到这两类数据类型的。这篇文章仅当做个记录了,应用到的时候能够参考下。

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据