https://blog.csdn.net/q3dxdx/article/details/51014357

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q3dxdx/article/details/51014357

BLOB,二进制大对象(字节流)。可以用来存储图片,声音和视频等二进制文件。没有字符集的说法。

TEXT,文本大对象(字符流)。可以用来存储大量的字符串,可以理解为超大的char或者varchar类型。由于是存储字符,所以有字符集的说法。

并且blob和text类型是无法设置默认值的。并且必要时要增大max_allowed_packet的值以适应该数据类型。

根据mysql的个性,blob和text又细分为:(存储限制来自网上摘录)

tinyblob,tinytext,最大存储限制255字节;

blob,text,最大存储限制65k(是真的吗?);

mediumblob,mediumtext,最大存储限制16M;

longblob,longtext,最大存储限制4G。

下面根据实验并以blob为例,来演示存储限制:

C:\Users\Administrator>mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.11-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test1
Database changed
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| t1              |
+-----------------+
1 row in set (0.00 sec)

mysql> drop table t1;
Query OK, 0 rows affected (0.28 sec)

mysql> CREATE TABLE t1 (
    ->   id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->   tiny_blob TINYBLOB,
    ->   b_blob BLOB,
    ->   medium_blob MEDIUMBLOB,
    ->   long_blob LONGBLOB
    -> );
Query OK, 0 rows affected (0.36 sec)

mysql> desc t1;
+-------------+------------+------+-----+---------+----------------+
| Field       | Type       | Null | Key | Default | Extra          |
+-------------+------------+------+-----+---------+----------------+
| id          | int(11)    | NO   | PRI | NULL    | auto_increment |
| tiny_blob   | tinyblob   | YES  |     | NULL    |                |
| b_blob      | blob       | YES  |     | NULL    |                |
| medium_blob | mediumblob | YES  |     | NULL    |                |
| long_blob   | longblob   | YES  |     | NULL    |                |
+-------------+------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> insert into t1(id) select 1;
Query OK, 1 row affected (0.09 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+----+-----------+--------+-------------+-----------+
| id | tiny_blob | b_blob | medium_blob | long_blob |
+----+-----------+--------+-------------+-----------+
|  1 | NULL      | NULL   | NULL        | NULL      |
+----+-----------+--------+-------------+-----------+
1 row in set (0.00 sec)

mysql>

#先建一个表t1,各种blob类型均有。

然后查看参数max_allowed_packet的大小:

mysql> select @@global.max_allowed_packet;
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                     8388608 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select 8388608/1024;
+--------------+
| 8388608/1024 |
+--------------+
|    8192.0000 |
+--------------+
1 row in set (0.00 sec)

mysql> select 8388608/1024/1024;
+-------------------+
| 8388608/1024/1024 |
+-------------------+
|        8.00000000 |
+-------------------+
1 row in set (0.00 sec)

mysql>

#8M

下面测试tinyblob的存储限制,看是否只能存储最大255字节的文件:

D:\Program Files\mysql-5.7.11-winx64\temp>dir
 驱动器 D 中的卷是 新加卷
 卷的序列号是 0672-4D3B

D:\Program Files\mysql-5.7.11-winx64\temp 的目录

2016/03/30  14:58    <DIR>          .
2016/03/30  14:58    <DIR>          ..
2016/03/30  14:58               255 test.255.file  #255字节
2016/03/30  14:58               256 test.256.file  #比255字节多1字节
               2 个文件            511 字节
               2 个目录 64,739,741,696 可用字节

D:\Program Files\mysql-5.7.11-winx64\temp>

#我们准备两个文件,一个是255字节,另一个是256字节。

现在我们更新tinyblob字段,看是否成功:

mysql> UPDATE t1
    -> SET t1.tiny_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.255.file')
    -> WHERE t1.id=1;
Query OK, 1 row affected (0.11 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> UPDATE t1
    -> SET t1.tiny_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.256.file')
    -> WHERE t1.id=1;
ERROR 1406 (22001): Data too long for column 'tiny_blob' at row 1
mysql>

很明显,根据上面得出,tinyblob类型的最大存储限制是255字节。

继续看看blob的存储限制是否是65k:

先准备需要的文件

D:\Program Files\mysql-5.7.11-winx64\temp>dir
 驱动器 D 中的卷是 新加卷
 卷的序列号是 0672-4D3B

D:\Program Files\mysql-5.7.11-winx64\temp 的目录

2016/03/30  15:28    <DIR>          .
2016/03/30  15:28    <DIR>          ..
2016/03/30  15:28            65,535 test.65535.file #比64K少1字节
2016/03/30  15:28            65,536 test.65536.file #65536字节,也就是刚刚64K
2016/03/30  15:28            65,537 test.65537.file #比64K多1字节
2016/03/30  15:26            66,559 test.65559.file #比65K少1字节
2016/03/30  15:25            66,560 test.65560.file #66560字节,也就是刚刚65K
2016/03/30  15:25            66,561 test.65561.file #比65K多1字节
               6 个文件        396,288 字节
               2 个目录 64,777,019,392 可用字节

D:\Program Files\mysql-5.7.11-winx64\temp>

#ok,文件已经准备好。来看看update是否成功:

mysql> UPDATE t1
    -> SET t1.b_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.65560.file')
    -> WHERE t1.id=1;
ERROR 1406 (22001): Data too long for column 'b_blob' at row 1
mysql>

#失败了,根据网上摘录资料显示,blob类型的最大存储限制是65K,而这里演示出实际上65k是无法存储的。已经超过了最大限制。

那么65559字节呢,能存储进去吗?

mysql> UPDATE t1
    -> SET t1.b_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.65559.file')
    -> WHERE t1.id=1;
ERROR 1406 (22001): Data too long for column 'b_blob' at row 1
mysql>

#可见,65559字节也是无法存储的。那么blob到底能存储多少字节呢?答案是65536-1=65535字节,也就是64K少1字节。

来看演示:

mysql> UPDATE t1
    -> SET t1.b_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.65537.file')
    -> WHERE t1.id=1;
ERROR 1406 (22001): Data too long for column 'b_blob' at row 1  #失败
mysql>
mysql> UPDATE t1
    -> SET t1.b_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.65536.file')
    -> WHERE t1.id=1;
ERROR 1406 (22001): Data too long for column 'b_blob' at row 1 #失败
mysql>

mysql> UPDATE t1
    -> SET t1.b_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.65535.file')
    -> WHERE t1.id=1;
Query OK, 1 row affected (0.18 sec)
Rows matched: 1  Changed: 1  Warnings: 0  #成功

mysql>

可见,blob类型的最大存储限制是65535字节,就是64K少1字节。而不是网上说的65K。

继续来看看mediumblob类型,是16M吗?

先更改max_allowed_packet参数为256M,以满足16M:

mysql> set @@global.max_allowed_packet=256*1024*1024;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

C:\Users\Administrator>mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.11-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@max_allowed_packet;
+----------------------+
| @@max_allowed_packet |
+----------------------+
|            268435456 | #256M,够大了
+----------------------+
1 row in set (0.00 sec)

mysql>

成功更改。

准备文件:

D:\Program Files\mysql-5.7.11-winx64\temp>dir
 驱动器 D 中的卷是 新加卷
 卷的序列号是 0672-4D3B

D:\Program Files\mysql-5.7.11-winx64\temp 的目录

2016/03/30  15:49    <DIR>          .
2016/03/30  15:49    <DIR>          ..
2016/03/30  15:48        16,777,215 test.16777215.file #比16M少1字节
2016/03/30  15:44        16,777,216 test.16777216.file #16777216字节,也就是刚刚16M
2016/03/30  15:48        16,777,217 test.16777217.file #比16M多1字节
               3 个文件     50,331,648 字节
               2 个目录 64,727,027,712 可用字节

D:\Program Files\mysql-5.7.11-winx64\temp>

下面看看更新mediumblob是否成功:

mysql> use test1
Database changed
mysql> UPDATE t1
    -> SET t1.medium_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.16777217.file')
    -> WHERE t1.id=1;
ERROR 1406 (22001): Data too long for column 'medium_blob' at row 1 #比16M多1字节,更新失败
mysql> UPDATE t1
    -> SET t1.medium_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.16777216.file')
    -> WHERE t1.id=1;
ERROR 1406 (22001): Data too long for column 'medium_blob' at row 1 #刚刚16M,更新也失败
mysql> UPDATE t1
    -> SET t1.medium_blob=LOAD_FILE('D:/Program Files/mysql-5.7.11-winx64/temp/test.16777215.file')
    -> WHERE t1.id=1;
Query OK, 1 row affected (4.19 sec)
Rows matched: 1  Changed: 1  Warnings: 0 #比16M少1字节,更新成功

mysql>

所以,mediumblob类型的最大存储限制不是16M,而是16M少1字节。

那么longblob呢?

个人目前无法测试,毕竟64位下max_allowed_packet参数的最大值是1G。所以4G的longblob类型无法测试。

但我告诉你,是4G少1字节。

所以,

tinyblob,tinytext,最大存储限制为28-1=255字节;

blob,text,最大存储限制为 216-1=64k-1字节;

mediumblob,mediumtext,最大存储限制为 224-1=16M-1字节;

longblob,longtext,最大存储限制为232-1=4G-1字节。

MySQL数据类型之BLOB与TEXT及其最大存储限制的更多相关文章

  1. 高性能mysql之慎用BLOB与TEXT

    文章转自 https://blog.csdn.net/john1337/article/details/70919212 BLOB与TEXT是为了存储极大的字符串而设计的数据类型,采用二进制与字符串方 ...

  2. 《高性能MySQL》笔记-BLOB与TEXT

    BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储. 实际上,它们分别属于两组不同的数据类型家族: 字符类型是TINYTEXT,SMALLTEXT,TEXT,M ...

  3. mysql中的blob和text区别

    经过查询资料发现 除了blob 还有tinyblob longblob mediumblob 当然text还有tinytext mediumtext longtext 都是最为大的存储 本质区别主要是 ...

  4. Mysql 数据类型使用说明

    FLOAT 和DOUBLE 类型支持使用标准的浮点运算进行近似计算. DECIMAL类型用于存储精确的小数. 因为cpu不支持对DECIMAL的直接计算,所以在Mysql5.0及更高的版本中,MYSQ ...

  5. 谈谈如何选择合适的MySQL数据类型

    MySQL数据类型选择 一 .选择原则 更小的通常更好:一般情况下选择可以正确存储数据的最小数据类型.越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小. 简单就好:简单的数据类型的操作通常需要更 ...

  6. MySQL数据类型及使用场景

    MySQL数据类型介绍 整数类型 类型名称 说明 存储需求 取值范围有符号 取值范围符号 TINYINT 很小的整数 1个字节 -128~127 0-255 SMALLINT 小的整数 2个字节 32 ...

  7. MySQL 数据类型总结及选取准则

    整数 整数有 TINYINT, SMALLINT, MEDIUMINT, INT 和 BIGINT 类型. 占用    8          ,  16            24,          ...

  8. mysql数据类型——TEXT和Blob

    TEXT是 以文本方式存储的,如果存储英文的话区分大小写  Blob是以二进制方式存储的,不区分大小写. xxxBlob存储的数据只能整体读出 有4种text类型:tinytext.text.medi ...

  9. MySQL 数据类型对比:char 与 varchar;varchar 与 text;datetime 与 timestamp;blob 与 text;

    char 与 varchar char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉.所以 char 类型存储的字符串末尾不能有空格,varchar 不限于此. char(n) 固 ...

随机推荐

  1. Linux shell awk数组使用

    awk中使用数组 一.数组格式 数组是一个包含一系列元素的表. 格式如下:     abc[1]="xiaohong"     abc[2]="xiaolan" ...

  2. Nginx 高级配置-https 功能

    Nginx 高级配置-https 功能 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTTPS工作过程 1>.SSL/TLS SSL(Secure Socket Lay ...

  3. 04、rpm+yum+tar解压

    Linux 下安装软件: 1.rpm 软件包的安装 一般安装都用 rpm -ivh 包路径及名字 如:rpm -ivh /soft/RealPlayer11GOLD.rpm   --安装/soft下 ...

  4. socket套接字及粘包问题

    socket套接字 1.什么是socket socket是一个模块,又称套接字,用来封装互联网协议(应用层以下的层) 2.为什么要有socket 实现应用层以下的层的工作,提高开发效率 3.怎么使用s ...

  5. 线程全局修改、死锁、递归锁、信号量、GIL以及多进程和多线程的比较

    线程全局修改 x = 100 def func1(): global x print(x) changex() print(x) def changex(): global x x = 50 func ...

  6. Electron实现第一个应用 "hello world"

    一. 什么是Electron? 它和NW.js的区别是什么? Electron是GitHub开发的桌面应用开发框架,它支持使用HTML.CSS.JavaScript来构建跨平台的桌面应用. Elect ...

  7. Browser cannot find PAC because wpad hostname cannot be resolved

    Enterprise Network administrator may faultly forget to configure wpad hostname to DNS server. If use ...

  8. Test of String

    1.前言 这是我出的第一套题目,话说感觉有点晚了,还是在向总安排下出的.我被安排的是字符串方面的内容,这应该相对而言是比较小众的知识点吧,但是一样的有作用的,也有很神的题目.所谓是NOIP模拟题,其实 ...

  9. 剑指offer 面试题8:二叉树的下一个节点

    题目:给定一棵二叉树和其中一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右节点的指针,还有一个节点指向父节点的指针. 中序遍历序列是{d,b,h,e,i,a,f,c,g} ...

  10. 图的遍历 | 1131地铁图: dfs复杂模拟题

    这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的.但是不能AC,让我很气. 最后查清原因:还是对dfs本质理解的不够. wa代码: vis[s]=1; dfs(s,e,0); ...