The Essential Guide to MySQL VARCHAR Data Type

摘要:本教程向您介绍 MySQL VARCHAR数据类型并讨论VARCHAR的一些重要功能。

MySQL VARCHAR 数据类型简介

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

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

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

让我们看一个例子。

我们将创建一个新表,其中有两列s1s2 ,长度分别为 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;
Code language: SQL (Structured Query Language) (sql)

该语句成功创建表。但是,如果我们将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;
Code language: SQL (Structured Query Language) (sql)

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 secCode language: JavaScript (javascript)

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

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

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

INSERT INTO items(title)
VALUES('ABCD');
Code language: SQL (Structured Query Language) (sql)

在此示例中,MySQL 发出以下错误消息:

Error Code: 1406. Data too long for column 'title' at row 1 0.000 secCode language: JavaScript (javascript)

MySQL VARCHAR 和空格

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

INSERT INTO items(title)
VALUES('AB ');
Code language: SQL (Structured Query Language) (sql)
SELECT 
    id, title, length(title)
FROM
    items;Code language: SQL (Structured Query Language) (sql)
MySQL VARCHAR with trailing space example

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

INSERT INTO items(title)
VALUES('ABC ');
Code language: SQL (Structured Query Language) (sql)

该语句将一个长度为 4 的字符串插入到title列中。 MySQL 仍然插入字符串,但是,它在插入值之前截断尾随空格。

1 row(s) affected, 1 warning(s): 1265 Data truncated for column 'title' at row 1
Code language: SQL (Structured Query Language) (sql)

您可以使用以下查询来验证它:

SELECT 
    title, LENGTH(title)
FROM
    items;
Code language: SQL (Structured Query Language) (sql)
MySQL VARCHAR example

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

本教程有帮助吗?