2022-10-27 402
前面文章我们介绍过一些常用数据类型的用法,比如 int、char、varchar 等。一直没详细介绍过 blob 及 text 类型,虽然这两类数据类型不太常用,但在某些场景下还是会用到的。本篇文章将主要介绍 blob 及 text 数据类型的相关知识。
blob(binary large object) 是一个可以存储二进制文件的容器,主要用于存储二进制大对象,例如可以存储图片,音视频等文件。按照可存储容量大小不同来分类,blob 类型可分为以下四种:
类型
|
可存储大小
|
用途
|
TINYBLOB
|
0 – 255字节
|
短文本二进制字符串
|
BLOB
|
0 – 65KB
|
二进制字符串
|
MEDIUMBLOB
|
0 – 16MB
|
二进制形式的长文本数据
|
LONGBLOB
|
0 – 4GB
|
二进制形式的极大文本数据
|
其中最常用的就是 blob 字段类型了,最多可存储 65KB 大小的数据,一般可用于存储图标或 logo 图片。不过数据库并不适合直接存储图片,如果有大量存储图片的需求,请使用对象存储或文件存储,数据库中可以存储图片路径来调用。
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 类型的使用方法:
#创建测试表字符集是utf8 mysql>showcreatetabletb_text\G ***************************1.row*************************** Table:tb_text CreateTable:CREATETABLE`tb_text`( `id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键', `a`tinytext, `b`text, `c`varchar(255)DEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8 #创建索引测试发现text类型必须指定前缀长度 mysql>altertabletb_textaddindexidx_a(a); ERROR1170(42000):BLOB/TEXTcolumn'a'usedinkeyspecificationwithoutakeylength mysql>altertabletb_textaddindexidx_b(b); ERROR1170(42000):BLOB/TEXTcolumn'b'usedinkeyspecificationwithoutakeylength mysql>altertabletb_textaddindexidx_c(c); QueryOK,0rowsaffected(0.04sec) Records:0Duplicates:0Warnings:0 mysql>altertabletb_textaddindexidx_b(b(10)); QueryOK,0rowsaffected(0.06sec) Records:0Duplicates:0Warnings:0 #插入数据测试(repeat函数用于生成重复数据) #正常插入 mysql>insertintotb_text(a,b,c)values(repeat('hello',3),repeat('hello',3),repeat('hello',3)); QueryOK,1rowaffected(0.01sec) #插入英文字符超标 mysql>insertintotb_text(a)values(repeat('hello',52)); QueryOK,1rowaffected,1warning(0.01sec) mysql>showwarnings; +---------+------+----------------------------------------+ |Level|Code|Message| +---------+------+----------------------------------------+ |Warning|1265|Datatruncatedforcolumn'a'atrow1| +---------+------+----------------------------------------+ 1rowinset(0.00sec) #插入中文超标 mysql>insertintotb_text(a)values(repeat('你好',100)); QueryOK,1rowaffected,1warning(0.02sec) mysql>showwarnings; +---------+------+----------------------------------------+ |Level|Code|Message| +---------+------+----------------------------------------+ |Warning|1265|Datatruncatedforcolumn'a'atrow1| +---------+------+----------------------------------------+ 1rowinset(0.00sec) #查看数据发现数据有所截取tinytext类型最多存储255字节数据 mysql>select*fromtb_text; +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+ |id|a|b|c| +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+ |1|hellohellohello|hellohellohello|hellohellohello| |2|hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello|NULL|NULL| |3|你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你|NULL|NULL| +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+-----------------+ 3rowsinset(0.00sec)
通过以上测试,我们注意到,text 类型可存储容量是以字节为单位而不是字符。例如 tinytext 最多存储 255 个字节而不是 255 个字符,在 utf8 字符集下,一个英文字母或数字占用一个字节,而一个中文汉字占用三个字节。也就是说 tinytext 最多存储 255/3=85 个汉字,text 最多存储 65535/3=21845 个汉字。而 varchar(M) 中的 M 指的是字符数,一个英文、数字、汉字都是占用一个字符,即 tinytext 可存储的大小并不比 varchar(255) 多。
本篇文章介绍了 blob 及 text 字段类型相关知识。虽然数据库规范中一般不推荐使用 blob 及 text 类型,但由于一些历史遗留问题或是某些场景下,还是会用到这两类数据类型的。这篇文章仅当做个记录了,使用到的时候可以参考下。
原文链接:https://77isp.com/post/10562.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态