百木园-与人分享,
就是让自己快乐。

说说 VARCHAR 背后的那些事

在使用MySQL的过程中,在存储字符串时,大家或许都有过这样或那样的困惑,譬如:

1.  对于固定长度的字符串,为什么推荐使用 CHAR 来存储?

2.  VARCHAR 可设置的最大长度是多少?

3.  给定一个字符串,怎么知道它的空间使用情况?

4.  创建索引时,提示“Index column size too large. The maximum column size is 767 bytes”,该如何解决?

5.  VARCHAR 为何要按需设置?VARCHAR(50) 和 VARCHAR(500) 有什么区别?

下面就这些问题做一个系统的分析。

 

1. CHAR与VARCHAR的区别

两者都可用来存储字符串。只不过 CHAR 常用来存储固定长度的字符串,VARCHAR 常用来存储可变长度的字符串。为什么要这样区分呢?

首先看下面这个表格。CHAR(4) 和 VARCHAR(4) 的存储对比。

值CHAR(4)存储需求(字节)VARCHAR(4)存储需求(字节)
\'\' \'    \' 4 \'\' 1
\'ab\' \'ab   \' 4 \'ab\' 3
\'abcd\' \'abcd\' 4 \'abcd\' 5
\'abcdefgh\' \'abcd\' 4 \'abcd\' 5

基于表格的内容,我们可以得出以下结论:

对于 CHAR(4) ,

1.  无论插入什么值,存储需求都是不变的,固定4个字节。

2.  在实际存储的时候,对于不足4字节的值,右边会以空格填充。

对于 VARCHAR(4) ,

1.  存储的需求与插入的值有关。

2.  存储的需求 = 字符串所占的字节数 + 1。为什么要加1呢?这个与 VARCHAR 的实现有关,为了实现“按需分配”的目的,它需要额外的字节来表示字符串的长度。

 

所以,对于固定长度的字符串推荐使用 CHAR 来存储,相对于 VARCHAR ,前者会少用一个字节。

另外,\'abcdefgh\'被截断为\'abcd\'进行存储,是在 SQL_MODE 非严格模式下。具体什么是 SQL_MODE 的非严格模式,可参考:使用MySQL,SQL_MODE有哪些坑,你知道么?

 

2. VARCHAR(M) 能设置的最大长度

M 限制了 VARCHAR 能存储的字符串的最大长度,注意,是字符,不是字节,其有效值范围为 0 ~ 65535。虽然可设置的范围是 0 ~ 65535,但 M 真的就能设置为65535 吗?

看下面这个测试。

mysql> create table t (c1 varchar(65535)) charset latin1;
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 t (c1 varchar(65534)) charset latin1;
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 t (c1 varchar(65533)) charset latin1;
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 t (c1 varchar(65532)) charset latin1;
Query OK,
0 rows affected (0.06 sec)

来源:https://www.cnblogs.com/ivictor/p/15142160.html
图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 说说 VARCHAR 背后的那些事

相关推荐

  • 暂无文章