MySQL 中 blob 和 text 數(shù)據(jù)類(lèi)型詳解
前言
前面文章我們介紹過(guò)一些常用數(shù)據(jù)類(lèi)型的用法,比如 int、char、varchar 等。一直沒(méi)詳細(xì)介紹過(guò) blob 及 text 類(lèi)型,雖然這兩類(lèi)數(shù)據(jù)類(lèi)型不太常用,但在某些場(chǎng)景下還是會(huì)用到的。本篇文章將主要介紹 blob 及 text 數(shù)據(jù)類(lèi)型的相關(guān)知識(shí)。
1. blob 類(lèi)型
blob(binary large object) 是一個(gè)可以存儲(chǔ)二進(jìn)制文件的容器,主要用于存儲(chǔ)二進(jìn)制大對(duì)象,例如可以存儲(chǔ)圖片,音視頻等文件。按照可存儲(chǔ)容量大小不同來(lái)分類(lèi),blob 類(lèi)型可分為以下四種:
類(lèi)型 | 可存儲(chǔ)大小 | 用途 |
---|---|---|
TINYBLOB | 0 - 255字節(jié) | 短文本二進(jìn)制字符串 |
BLOB | 0 - 65KB | 二進(jìn)制字符串 |
MEDIUMBLOB | 0 - 16MB | 二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù) |
LONGBLOB | 0 - 4GB | 二進(jìn)制形式的極大文本數(shù)據(jù) |
其中最常用的就是 blob 字段類(lèi)型了,最多可存儲(chǔ) 65KB 大小的數(shù)據(jù),一般可用于存儲(chǔ)圖標(biāo)或 logo 圖片。不過(guò)數(shù)據(jù)庫(kù)并不適合直接存儲(chǔ)圖片,如果有大量存儲(chǔ)圖片的需求,請(qǐng)使用對(duì)象存儲(chǔ)或文件存儲(chǔ),數(shù)據(jù)庫(kù)中可以存儲(chǔ)圖片路徑來(lái)調(diào)用。
2. text 類(lèi)型
text 類(lèi)型同 char、varchar 類(lèi)似,都可用于存儲(chǔ)字符串,一般情況下,遇到存儲(chǔ)長(zhǎng)文本字符串的需求時(shí)可以考慮使用 text 類(lèi)型。按照可存儲(chǔ)大小區(qū)分,text 類(lèi)型同樣可分為以下四種:
類(lèi)型 | 可存儲(chǔ)大小 | 用途 |
---|---|---|
TINYTEXT | 0 - 255字節(jié) | 一般文本字符串 |
TEXT | 0 - 65 535字節(jié) | 長(zhǎng)文本字符串 |
MEDIUMTEXT | 0 - 16 772 150字節(jié) | 較大文本數(shù)據(jù) |
LONGTEXT | 0 - 4 294 967 295字節(jié) | 極大文本數(shù)據(jù) |
不過(guò)在日常場(chǎng)景中,存儲(chǔ)字符串還是盡量用 varchar ,只有要存儲(chǔ)長(zhǎng)文本數(shù)據(jù)時(shí),可以使用 text 類(lèi)型。對(duì)比 varchar ,text 類(lèi)型有以下特點(diǎn):
- text 類(lèi)型無(wú)須指定長(zhǎng)度。
- 若數(shù)據(jù)庫(kù)未啟用嚴(yán)格的 sqlmode ,當(dāng)插入的值超過(guò) text 列的最大長(zhǎng)度時(shí),則該值會(huì)被截?cái)嗖迦氩⑸删妗?/li>
- text 類(lèi)型字段不能有默認(rèn)值。
- varchar 可直接創(chuàng)建索引,text 字段創(chuàng)建索引要指定前多少個(gè)字符。
- text 類(lèi)型檢索效率比 varchar 要低。
下面我們來(lái)具體測(cè)試下 text 類(lèi)型的使用方法:
# 創(chuàng)建測(cè)試表 字符集是 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 # 創(chuàng)建索引測(cè)試 發(fā)現(xiàn)text類(lèi)型必須指定前綴長(zhǎng)度 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 # 插入數(shù)據(jù)測(cè)試(repeat函數(shù)用于生成重復(fù)數(shù)據(jù)) # 正常插入 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) # 插入英文字符超標(biāo) 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) # 插入中文超標(biāo) 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) # 查看數(shù)據(jù) 發(fā)現(xiàn)數(shù)據(jù)有所截取 tinytext 類(lèi)型最多存儲(chǔ)255字節(jié)數(shù)據(jù) 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)
通過(guò)以上測(cè)試,我們注意到,text 類(lèi)型可存儲(chǔ)容量是以字節(jié)為單位而不是字符。例如 tinytext 最多存儲(chǔ) 255 個(gè)字節(jié)而不是 255 個(gè)字符,在 utf8 字符集下,一個(gè)英文字母或數(shù)字占用一個(gè)字節(jié),而一個(gè)中文漢字占用三個(gè)字節(jié)。也就是說(shuō) tinytext 最多存儲(chǔ) 255/3=85 個(gè)漢字,text 最多存儲(chǔ) 65535/3=21845 個(gè)漢字。而 varchar(M) 中的 M 指的是字符數(shù),一個(gè)英文、數(shù)字、漢字都是占用一個(gè)字符,即 tinytext 可存儲(chǔ)的大小并不比 varchar(255) 多。
總結(jié)
本篇文章介紹了 blob 及 text 字段類(lèi)型相關(guān)知識(shí)。雖然數(shù)據(jù)庫(kù)規(guī)范中一般不推薦使用 blob 及 text 類(lèi)型,但由于一些歷史遺留問(wèn)題或是某些場(chǎng)景下,還是會(huì)用到這兩類(lèi)數(shù)據(jù)類(lèi)型的。這篇文章僅當(dāng)做個(gè)記錄了,使用到的時(shí)候可以參考下。
到此這篇關(guān)于MySQL 中 blob 和 text 數(shù)據(jù)類(lèi)型詳解的文章就介紹到這了,更多相關(guān)MySQL blob和text 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql通過(guò)Adjacency List(鄰接表)存儲(chǔ)樹(shù)形結(jié)構(gòu)
本片介紹MYSQL存儲(chǔ)樹(shù)形結(jié)構(gòu)的一種方法,通過(guò)Adjacency List來(lái)實(shí)現(xiàn),一起來(lái)學(xué)習(xí)下。2017-12-12MySql官方手冊(cè)學(xué)習(xí)筆記1 MySql簡(jiǎn)單上手
這是我學(xué)習(xí)MySql 5.1時(shí)做的一些整理與筆記,希望能理一理自己學(xué)到的東西,如果能有助于各位同道學(xué)習(xí)MySql那就更是意外之喜了,呵呵2012-10-10SQL如何獲取目標(biāo)時(shí)間點(diǎn)或日期的方法實(shí)例
日期獲取在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到,這篇文章主要給大家介紹了關(guān)于SQL如何獲取目標(biāo)時(shí)間點(diǎn)或日期的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10MySQL中實(shí)現(xiàn)分頁(yè)操作的實(shí)戰(zhàn)指南
MySQL的分頁(yè)似乎一直是個(gè)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于MySQL中實(shí)現(xiàn)分頁(yè)操作的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Linux連接mysql報(bào)錯(cuò):Access denied for user ‘root’@‘localhost’(usi
這篇文章主要給大家介紹了關(guān)于Linux連接mysql數(shù)據(jù)庫(kù)報(bào)錯(cuò):Access denied for user ’root‘@’localhost‘(using password: YES)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01mysql獲取指定時(shí)間段中所有日期或月份的語(yǔ)句(不設(shè)存儲(chǔ)過(guò)程,不加表)
最近需要用mysql獲取一個(gè)時(shí)間段中的所有月份,網(wǎng)上查都是要設(shè)置存儲(chǔ)過(guò)程或者加一個(gè)日期表的,不滿足我的需求,翻墻找資料加上自己試驗(yàn),如下代碼分享給大家2021-06-06Mysql存儲(chǔ)過(guò)程和函數(shù)區(qū)別介紹
這篇文章主要介紹了Mysql存儲(chǔ)過(guò)程和函數(shù)的區(qū)別,需要的朋友可以參考下2014-03-03