Skip to main content

MySQL VARCHAR数据类型基本指南示例

MySQL VARCHAR数据类型简介

MySQL VARCHAR是长度可变的字符串,其长度最多可达65535。MySQL将VARCHAR值存储为1字节或2字节长度前缀加上实际数据。

长度前缀指定值中的字节数。如果列所需的字节数少于255字节,则长度前缀为1字节。如果列需要超过255个字节,则长度前缀为两个长度字节。

但是,最大长度取决于最大行大小(65535字节)和使用的字符集。这意味着所有列的总长度应小于65535字节。

让我们看一个例子。

我们将创建一个新表,该表有两列s1和s2,长度分别为32765(+2表示长度前缀)和32766(+2)。请注意,32765+2+32766+2=65535是最大行大小。

CREATE TABLE IF NOT EXISTS varchar_test (
s1 VARCHAR(32765) NOT NULL,
s2 VARCHAR(32766) NOT NULL
) CHARACTER SET 'latin1' COLLATE LATIN1_DANISH_CI;

该语句成功创建了表。但是,如果我们将s1列的长度增加1。

CREATE TABLE IF NOT EXISTS varchar_test_2 (
s1 VARCHAR(32766) NOT NULL, -- error
s2 VARCHAR(32766) NOT NULL
) CHARACTER SET 'latin1' COLLATE LATIN1_DANISH_CI;

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 0.000 sec

如您所见,行大小太大,语句失败。

如果插入长度大于VARCHAR列长度的字符串,MySQL将发出错误。考虑下面的例子:

CREATE TABLE items (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(3)
);

INSERT INTO items(title)
VALUES('ABCD');

在本例中,MySQL发出了以下错误消息:

Error Code: 1406. Data too long for column 'title' at row 1 0.000 sec

MySQL VARCHAR和空间

MySQL在存储VARCHAR值时不填充空间。此外,MySQL在插入或选择VARCHAR值时会保留尾随空格。请参见以下示例:

INSERT INTO items(title)
VALUES('AB ');

SELECT 
id, title, length(title)
FROM
items;

MySQL VARCHAR with trailing space example

但是,当插入一个包含尾部空格的VARCHAR值时,MySQL会截断尾部空格,这会导致列长度超过。此外,MySQL还会发出警告。让我们看看下面的例子:

INSERT INTO items(title)
VALUES('ABC ');

此语句在标题列中插入长度为4的字符串。MySQL仍然会插入字符串,但是在插入值之前会截断尾随空间。

1 row(s) affected, 1 warning(s): 1265 Data truncated for column 'title' at row 1

您可以使用以下查询进行验证:

SELECT 
title, LENGTH(title)
FROM
items;

MySQL VARCHAR example

在本教程中,您学习了如何使用MySQL VARCHAR数据类型在数据库中存储变量字符串。