本教程将向您介绍MySQL VARCHAR数据类型,并讨论VARCHAR的一些重要功能。
MySQL VARCHAR数据类型简介
MySQL VARCHAR是可变长度的字符串,其长度可以达到65,535个字符。 MySQL将VARCHAR值作为1字节或2字节长度前缀加上实际数据。
长度前缀指定值的字节数。 如果列需要少于255个字节,则长度前缀为1个字节。 如果列需要超过255个字节,长度前缀是两个长度字节。
但是,最大长度受到最大行大小(65,535字节)和所使用的字符集的限制。 这意味着所有列的总长度应该小于65,535字节。
下面我们来看一个例子。
创建一个新的表,它有两列s1和s2,长度分别为32765(长度前缀为+2)和32766(+2)。注意,32765 + 2 + 32766 + 2 = 65535,这是最大行大小。
USE testdb;
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。
USE testdb;
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将发出错误。 请考虑以下示例:
USE testdb;
CREATE TABLE items (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(3)
);
INSERT INTO items(title)
VALUES('ABCD');
在这个例子中,MySQL发出以下错误消息:
1406 - Data too long for column 'title' at row 1
MySQL VARCHAR和空格
当MySQL存储VARCHAR值时,MySQL不会占用空间。 此外,MySQL在插入或选择VARCHAR值时保留尾随空格。请参阅以下示例:
INSERT INTO items(title)
VALUES('AB ');
查询插入字符串值的长度,如下所示 -
SELECT
id, title, length(title)
FROM
items;
+----+-------+---------------+
| id | title | length(title) |
+----+-------+---------------+
| 1 | AB | 3 |
+----+-------+---------------+
1 row in set
但是,当插入包含导致列长度超过的尾随空格的VARCHAR值时,MySQL将截断尾随空格。 此外,MySQL发出警告。我们来看下面的例子:
INSERT INTO items(title)
VALUES('ABC ');
此语句将长度为4的字符串插入标title列。 MySQL仍然插入字符串,但是在插入该值之前会截断尾随空格。
row(s) affected, 1 warning(s): 1265 Data truncated for column 'title' at row 1
可以使用以下查询来验证它:
SELECT
title, LENGTH(title)
FROM
items;
+-------+---------------+
| title | LENGTH(title) |
+-------+---------------+
| AB | 3 |
| ABC | 3 |
+-------+---------------+
2 rows in set
在本教程中,您已经学习了如何使用MySQL VARCHAR数据类型来存储数据库中的可变长度字符串的值。