The BLOB and TEXT Types

官网参考:https://dev.mysql.com/doc/refman/5.7/en/blob.html

字符串类型对应的存储需求

Data TypeStorage Required
CHAR(M)M × w bytes, 0 <= M <= 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)M bytes, 0 <= M <= 255
VARCHAR(M), VARBINARY(M)L + 1 bytes if column values require 0 − 255 bytes, L + 2 bytes if values may require more than 255 bytes
TINYBLOB, TINYTEXTL + 1 bytes, where L < 28
BLOB, TEXTL + 2 bytes, where L < 216
MEDIUMBLOB, MEDIUMTEXTL + 3 bytes, where L < 224
LONGBLOB, LONGTEXTL + 4 bytes, where L < 232
ENUM('value1','value2',...)1 or 2 bytes, depending on the number of enumeration values (65,535 values maximum)
SET('value1','value2',...)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进行设置,客户端和服务器端都需要设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值