MySQL varchar型別

2019-10-16 22:58:32

本教學將向您介紹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,這是最大行大小。

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資料型別來儲存資料庫中的可變長度字串的值。