• 技术文章 >数据库 >mysql教程

    一起聊聊MySQL中blob和text数据类型(示例详解)

    长期闲置长期闲置2022-01-13 15:42:00转载131
    本篇文章我们来看一下mysql中的blob和text数据类型,blob是一个可以存储二进制文件的容器,text类型同char、varchar 类似,都可用于存储字符串,下面我们就一起来看一下这两个数据类型的相关知识,希望对大家有帮助。

    1. blob 类型

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

    08.png

    其中最常用的就是 blob 字段类型了,最多可存储 65KB 大小的数据,一般可用于存储图标或 logo 图片。不过数据库并不适合直接存储图片,如果有大量存储图片的需求,请使用对象存储或文件存储,数据库中可以存储图片路径来调用。

    2. text 类型

    text 类型同 char、varchar 类似,都可用于存储字符串,一般情况下,遇到存储长文本字符串的需求时可以考虑使用 text 类型。按照可存储大小区分,text 类型同样可分为以下四种:

    09.png

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

    下面我们来具体测试下 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 类型,但由于一些历史遗留问题或是某些场景下,还是会用到这两类数据类型的。这篇文章仅当做个记录了,使用到的时候可以参考下。

    推荐学习:mysql视频教程

    以上就是一起聊聊MySQL中blob和text数据类型(示例详解)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:Mysql技术公众号,如有侵犯,请联系admin@php.cn删除
    专题推荐:mysql
    上一篇:你了解MySQL中的变量、流程控制与游标? 下一篇:一起聊聊mysql中的账户和权限

    相关文章推荐

    • mysql怎样查询重复字段• mysql怎样查询区分大小写• mysql存储过程中的if怎么使用• 怎样修改mysql时间• mysql怎样查询被锁的表

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网