MySQL VARCHAR 数据类型
简介:本教程向您介绍MySQL
VARCHAR
数据类型并讨论了一些重要的特性VARCHAR
。
MySQL VARCHAR数据类型简介
MySQLVARCHAR
是可变长度的字符串,其长度最多可达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 1118 (42000): 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如您所见,行大小太大而语句失败。 如果插入长度大于
VARCHAR
列长度的字符串,MySQL将发出错误。请考虑以下示例:
CREATE TABLE varchar_test_3 ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(3) ); INSERT INTO varchar_test_3(title) VALUES('ABCD');在此示例中,MySQL发出以下错误消息:
ERROR 1406 (22001): Data too long for column 'title' at row 1
MySQL VARCHAR和空格
MySQL在存储VARCHAR
值时不会填充空间。此外,MySQL在插入或选择VARCHAR
值时会保留尾随空格。请参阅以下示例:
INSERT INTO varchar_test_3(title) VALUES('AB ');
SELECT id, title, length(title) FROM varchar_test_3;
+----+-------+---------------+ | id | title | length(title) | +----+-------+---------------+ | 1 | AB | 3 | +----+-------+---------------+ 1 row in set (0.00 sec)但是,当插入
VARCHAR
包含导致超出列长度的尾随空格的值时,MySQL将截断尾随空格。此外,MySQL发出警告。我们来看下面的例子:
INSERT INTO varchar_test_3(title) VALUES('ABC ');此语句将长度为4的字符串插入到
title
列中。MySQL仍会插入字符串,但是在插入值之前它会截断尾随空格。
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> show warnings; +-------+------+--------------------------------------------+ | Level | Code | Message | +-------+------+--------------------------------------------+ | Note | 1265 | Data truncated for column 'title' at row 1 | +-------+------+--------------------------------------------+ 1 row in set (0.00 sec)您可以使用以下查询进行验证:
SELECT title, LENGTH(title) FROM varchar_test_3;
+-------+---------------+ | title | LENGTH(title) | +-------+---------------+ | AB | 3 | | ABC | 3 | +-------+---------------+ 2 rows in set (0.00 sec)在本教程中,您学习了如何使用MySQL
VARCHAR
数据类型在数据库中存储变量字符串。