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;
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
语句已成功创建表。但是,如果我们将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