服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL 中 Blob 和 Text 数据类型详解

MySQL 中 Blob 和 Text 数据类型详解

2021-12-31 23:02MySQL技术 Mysql

blob(binary large object) 是一个可以存储二进制文件的容器,主要用于存储二进制大对象,例如可以存储图片,音视频等文件。

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 类型的使用方法:

  1. # 创建测试表 字符集是 utf8 
  2. mysql> show create table tb_text\G 
  3. *************************** 1. row *************************** 
  4.        Table: tb_text 
  5. Create TableCREATE TABLE `tb_text` ( 
  6.   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键'
  7.   `a` tinytext, 
  8.   `b` text, 
  9.   `c` varchar(255) DEFAULT NULL
  10.   PRIMARY KEY (`id`) 
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 
  12.  
  13. # 创建索引测试 发现text类型必须指定前缀长度 
  14. mysql> alter table tb_text add index idx_a (a); 
  15. ERROR 1170 (42000): BLOB/TEXT column 'a' used in key specification without a key length 
  16. mysql> alter table tb_text add index idx_b (b);  
  17. ERROR 1170 (42000): BLOB/TEXT column 'b' used in key specification without a key length 
  18. mysql> alter table tb_text add index idx_c (c); 
  19. Query OK, 0 rows affected (0.04 sec) 
  20. Records: 0  Duplicates: 0  Warnings: 0 
  21. mysql> alter table tb_text add index idx_b (b(10)); 
  22. Query OK, 0 rows affected (0.06 sec) 
  23. Records: 0  Duplicates: 0  Warnings: 0 
  24.  
  25. # 插入数据测试(repeat函数用于生成重复数据) 
  26. # 正常插入 
  27. mysql> insert into tb_text  (a,b,c) values (repeat('hello',3),repeat('hello',3),repeat('hello',3)); 
  28. Query OK, 1 row affected (0.01 sec) 
  29. # 插入英文字符超标 
  30. mysql> insert into tb_text  (a) values (repeat('hello',52)); 
  31. Query OK, 1 row affected, 1 warning (0.01 sec) 
  32. mysql> show warnings; 
  33. +---------+------+----------------------------------------+ 
  34. Level   | Code | Message                                | 
  35. +---------+------+----------------------------------------+ 
  36. | Warning | 1265 | Data truncated for column 'a' at row 1 | 
  37. +---------+------+----------------------------------------+ 
  38. 1 row in set (0.00 sec) 
  39. # 插入中文超标 
  40. mysql>  insert into tb_text  (a) values (repeat('你好',100)); 
  41. Query OK, 1 row affected, 1 warning (0.02 sec) 
  42. mysql> show warnings; 
  43. +---------+------+----------------------------------------+ 
  44. Level   | Code | Message                                | 
  45. +---------+------+----------------------------------------+ 
  46. | Warning | 1265 | Data truncated for column 'a' at row 1 | 
  47. +---------+------+----------------------------------------+ 
  48. 1 row in set (0.00 sec) 
  49. # 查看数据 发现数据有所截取 tinytext 类型最多存储255字节数据 
  50. mysql> select * from tb_text; 
  51. +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+ 
  52. | id | a                                                                                                                                                                                                                                                               | b               | c               | 
  53. +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+ 
  54. |  1 | hellohellohello                                                                                                                                                                                                                                                 | hellohellohello | hellohellohello | 
  55. |  2 | hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello | NULL            | NULL            | 
  56. |  3 | 你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你                                                                                      | NULL            | NULL            | 
  57. +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+ 
  58. 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 类型,但由于一些历史遗留问题或是某些场景下,还是会用到这两类数据类型的。这篇文章仅当做个记录了,使用到的时候可以参考下。

原文链接:https://mp.weixin.qq.com/s/SjaCSkcjT0rcO1n41RuEcA

延伸 · 阅读

精彩推荐
  • MysqlMySQL锁阻塞的深入分析

    MySQL锁阻塞的深入分析

    这篇文章主要给大家介绍了关于MySQL锁阻塞的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    bosco19864412021-03-13
  • MysqlMySql日期查询语句详解

    MySql日期查询语句详解

    在mysql中对时间日期操作的函数有很多,有时我们就希望直接通过sql查询出指定日期的数据 ...

    MYSQL教程网6002020-01-13
  • MysqlSQL 优化

    SQL 优化

    (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的 SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索...

    mysql技术网3322019-10-15
  • Mysqlmysql4.0升级到mysql5(4.1),解决字符集问题

    mysql4.0升级到mysql5(4.1),解决字符集问题

    软件升级部分就不说了,光说数据库迁移。 ...

    mysql教程网2132019-11-01
  • MysqlMysql错误:Too many connections的解决方法

    Mysql错误:Too many connections的解决方法

    这篇文章主要给大家介绍了关于Mysql错误Too many connections的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值...

    IT技术院6972020-09-29
  • MysqlMysql中Identity 详细介绍

    Mysql中Identity 详细介绍

    这篇文章主要介绍了Mysql中Identity 的相关资料,并附示例代码,需要的朋友可以参考下...

    mysql技术网15252020-06-26
  • MysqlMysql一些复杂的sql语句(查询与删除重复的行)

    Mysql一些复杂的sql语句(查询与删除重复的行)

    这篇文章主要介绍了Mysql一些复杂的sql语句(查询与删除重复的行),需要的朋友可以参考下...

    mdxy-dxy4022020-07-28
  • MysqlMySQL 触发器定义与用法简单实例

    MySQL 触发器定义与用法简单实例

    这篇文章主要介绍了MySQL 触发器定义与用法,结合简单实例形式总结分析了mysql触发器的语法、原理、定义及使用方法,需要的朋友可以参考下...

    yqwang754574362020-12-03