The BLOB and TEXT Types
官网参考:https://dev.mysql.com/doc/refman/5.7/en/blob.html
字符串类型对应的存储需求
| Data Type | Storage Required |
|---|---|
CHAR( |
M × w bytes, 0 <= 255, where w is the number of bytes required for the maximum-length character in the character set. See Section 14.8.1.2, “The Physical Row Structure of an InnoDB Table” for information about CHAR data type storage requirements for InnoDB tables. |
BINARY( |
M bytes, 0 <= 255 |
VARCHAR(, VARBINARY( |
L + 1 bytes if column values require 0 − 255 bytes, L + 2 bytes if values may require more than 255 bytes |
TINYBLOB, TINYTEXT |
L + 1 bytes, where L < 28 |
BLOB, TEXT |
L + 2 bytes, where L < 216 |
MEDIUMBLOB, MEDIUMTEXT |
L + 3 bytes, where L < 224 |
LONGBLOB, LONGTEXT |
L + 4 bytes, where L < 232 |
ENUM(' |
1 or 2 bytes, depending on the number of enumeration values (65,535 values maximum) |
SET(' |
1, 2, 3, 4, or 8 bytes, depending on the number of set members (64 members maximum) |
关于row size 参考官方文档
- varchar允许的最大字符长度是65,535,超过这个限制就需要考虑text和blob
- varchar(N),N 代表允许的中文字的个数(字符集为utf8的一个中文字占用三个字符)也表示英文字符的个数,
mysql> desc varch
-> ;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | varchar(3) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec) mysql> insert into varch values('hell');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into varch values('hel');
Query OK, 1 row affected (0.00 sec) mysql> select * from varch;
+-----------+
| name |
+-----------+
| 新中国 |
| hel |
+-----------+
2 rows in set (0.00 sec)
- N>255就会占用2个额外的字符存储长度,所以N最大为(65535-2)/3
mysql> create table varch(name varchar(21845));
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table varch(name varchar(21844));
Query OK, 0 rows affected (0.11 sec)
- 对于innodb,row size 的限制是
innodb_page_size的设置的一半(如果设置不超过32KB,默认是16KB),对于text 和blob 没有限制,只会占用row size 的9-12字节(byte)
mysql> create table varch(col1 varchar(10920),col2 varchar(10920),col3 text);
Query OK, 0 rows affected (0.12 sec)
# 10920 计算公式
mysql> select (65535-(2+2+9))/3/2;
+---------------------+
| (65535-(2+2+9))/3/2 |
+---------------------+
| 10920.33333333 |
+---------------------+
# 括号里的2、2、9是字段的长度存储所需大小
- text相当于longvarchar,BLOB值被视为二进制字符串(字节串)。 它们具有二进制字符集和排序规则,比较和排序基于列值中字节的数值。 TEXT值被视为非二进制字符串(字符串)。 它们具有除二进制之外的字符集,并且基于字符集的排序来对值进行排序和比较。blob相当于binaryvarchar
注意点
- 创建索引时必须制定前缀
- 非strict sql mode模式下,如果长度超过限制,则会自动进行截断
- 不支持default值
text 和 blob 类型的字段可能会非常的长,所以就可能遇到以下限制
- 进行分组或排序时只会对
max_sort_length指定的长度进行,次变量默认值为1024,可以进行session级别的调整 - 由于memory 存储引擎不支持这两种类型,所以包含此字段的查询如果用到临时表,则表会在磁盘上创建,从而会造成性能的消耗,所以避免使用
SELECT * - server和client传输此类型的数据时可能会超过通信包的长度限制,通过
max_allowed_packet进行设置,客户端和服务器端都需要设置
The BLOB and TEXT Types的更多相关文章
- Mysql BLOB和TEXT类型
BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同. A binary la ...
- 1074, "Column length too big for column 'err_solution' (max = 21845); use BLOB or TEXT instead"
一个注意点,就是sqlalchemy 使用create_all()建表的时候,要在 create_all()所在页面import那些表的model sqlalchemy.exc.Operational ...
- Mysql BLOB、BLOB与TEXT区别及性能影响、将BLOB类型转换成VARCHAR类型
在排查公司项目业务逻辑的时候,见到了陌生的字眼,如下图 顺着关键字BLOB搜索,原来是Mysql存储的一种类型,从很多文章下了解到如下信息 了解 MySQL中,BLOB字段用于存储二进制数据,是一个可 ...
- 高性能mysql之慎用BLOB与TEXT
文章转自 https://blog.csdn.net/john1337/article/details/70919212 BLOB与TEXT是为了存储极大的字符串而设计的数据类型,采用二进制与字符串方 ...
- MySQL 数据类型对比:char 与 varchar;varchar 与 text;datetime 与 timestamp;blob 与 text;
char 与 varchar char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉.所以 char 类型存储的字符串末尾不能有空格,varchar 不限于此. char(n) 固 ...
- MySql中Blob与Text的区别
BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同. 有4种TEXT类型:TIN ...
- MySQL中blob 与 text
BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同. 有4种TEXT类型:TIN ...
- 《高性能MySQL》笔记-BLOB与TEXT
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储. 实际上,它们分别属于两组不同的数据类型家族: 字符类型是TINYTEXT,SMALLTEXT,TEXT,M ...
- MySQL数据类型之BLOB与TEXT及其最大存储限制
https://blog.csdn.net/q3dxdx/article/details/51014357 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.n ...
随机推荐
- codeforces727C(交互)
题意 $n$个数,初始时不知道他们的值. 每次可以询问两个数的和,在$n$次询问内确定他们的值 $n \leqslant 5000$ Sol 首先询问出$1, 2$,$1, 3$,$2, 3$ 解个方 ...
- 盒子模型--IE与标准
从上图可以看到标准 W3C 盒子模型的范围包括 margin.border.padding.content,并且 content 部分不包含其他部分. 从上图可以看到 IE 盒子模型的范围也包括 ma ...
- 面向对象-类-成员变量-局部变量-this
1.能够理解面向对象的思想 面向对象是基于面向过程的编程思想,强调的是对象,由对象去调用功能.它是一种更符合人类习惯的编程思想,可以将复杂的事情简单化,将我们的角色从执行者变成了指挥者. 2. ...
- 洛谷 P2617 Dynamic Ranking
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- mohout安装
安装完成之后的环境变量的配置如下: JAVA_HOME=/usr/local/jdk1.8.0_144JRE_HOME=/usr/java/jdk1.8.0_144/jreCLASSPATH=.:$J ...
- (转)SpringMVC学习(五)——SpringMVC的参数绑定
http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...
- Vue和SuperSlide做轮播效果
使用这个插件做轮播需要的js应该知道,就是vue.js和jquery.SuperSlide.2.1.1.js 下载地址: vue:https://vuejs.org/js/vue.js 这里直接Ctr ...
- Vue的elementUI实现自定义主题
使用vue开发项目,用到elementUI,根据官网的写法,我们可以自定义主题来适应我们的项目要求,下面来介绍一下两种方法实现的具体步骤,(可以参考官方文档自定义主题官方文档),先说项目中没有使用sc ...
- Bootstrap历练实例:点击激活的按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- python virtualenv学习
补充:在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. virtualenv就是 ...