MySQL VARCHAR 数据类型介绍

在本文中,我们将带您了解 MySQL 中的 VARCHAR 数据类型。

在 MySQL 中, VARCHAR 是可变长度的字符串类型,这与 CHAR 数据类型有所不同。当一个列的类型定义为 VARCHAR 类型后,列中的内容的长度就是内容本身的长度(字符数)。

MySQL VARCHAR 语法

当我们使用 VARCHAR 数据类型时,我们需要指定一个最大的长度。其语法如下:

VARCHAR(max_length)

其中 max_length 是一个数值,它指示了此列的最大字符数。如果我们不指定此值,则默认值是 255。也就是说 VARCHAR 等同于 VARCHAR(255)

MySQL 存储 VARCHAR 数值时,会将最前的 1 或者 2 个字节存储为实际字符串内容的长度。如果列的值少于 255 个字节,则长度前缀为 1 个字节,否则为 2 个字节。

VARCHAR 允许的最大长度为 65535 个字节,这也是 MySQL 中的行大小的限制。

在 MySQL 中,除了 TEXTBLOB 列, 行大小限制为 65535 个字节。那么 VARCHAR 最多长度为 65535 个字节。

此外,一个 VARCHAR 列中能够存储多少个字符还和数据库使用的字符集有关。

MySQL VARCHAR 实例

让我们看一个简单例子。

我们将尝试使用最大长度创建一个新的表,如下:

CREATE TABLE test_varchar_latin1 (v VARCHAR(65535))
CHARACTER SET 'latin1';

注意这里,我们使用了字符集 latin1。此时,MySQL 将发出错误消息:

Error Code: 1118. 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

这里,因为 VARCHAR 有 2 个字节用于长度前缀,因此我们最大只能设置为 VARCHAR(65532)

现在我们再看一个使用了 utf8 编码的实例:

CREATE TABLE test_varchar_utf8 (v VARCHAR(65535))
CHARACTER SET 'utf8';

此时,MySQL 将发出如下的错误消息:

Error Code: 1074. Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

这是因为每个 utf8 字符最多占用 3 个字节,因此: 65535 / 3 = 21845

VARCHAR 截断内容

当插入的内容超过 VARCHAR 列定义的长度时,MySQL 会采用如下策略:

  • 如果超过的部分只包含空格,则多余的空格会被截断。
  • 如果超过的部分不只是空格,则给出错误提示。

让我们先创建一个测试表,只有一个字段 v,且定义为 VARCHAR(2)

CREATE TABLE test_varchar (v VARCHAR(2))
CHARACTER SET 'latin1';

让我们插入一个值 'A ',它包含 2 个空格,总长度为 3。

INSERT INTO test_varchar
VALUES ('A  ')
1 row(s) affected, 1 warning(s): 1265 Data truncated for column 'v' at row 1

此时插入成功,但是 MySQL 给出了截断提示。

让我们再一个值 'ABC',它的长度为 3。

INSERT INTO test_varchar
VALUES ('ABC')
Error Code: 1406. Data too long for column 'v' at row 1

这里,插入数据失败。

结论

在本文中,我们讨论了 MySQL VARCHAR 数据类型以及 VARCHAR 数据类型的长度限制和对于超过长度的内容的处理方式。