MySQL VARCHAR数据类型

时间:2019-11-20 08:52:11  来源:igfitidea点击:

简介:本教程向您介绍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,这是最大行大小。

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;

但是,当插入一个VARCHAR值时,MySQL将截断尾随空格,该VARCHAR值包含导致超出列长度的尾随空格。
另外,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数据类型在数据库中存储变量字符串。