1. 程式人生 > 其它 >mysql的varchar最大能儲存多少個字元?

mysql的varchar最大能儲存多少個字元?

mysql中varchar能夠儲存可變長度的字串。過去我做的諸多業務中,一般儲存短字串的需求,都會使用varchar型別,並且定義長度為255,也就是varchar(255)。

不過為了探究varchar這種型別到底是怎麼儲存的,它的最大長度能達到多少,我決定區翻一下mysql文件學習一下。

varchar怎麼儲存

經過一番瞭解,varchar最大能儲存的長度為65535位元組。儲存字串的時候,會將字串的長度存在首部,接著才是內容。

當varchar儲存的字元個數小於或等於255的時候,首部需要一個位元組來記錄字元的個數。當內容大於255的字元的時候,首部需要2個自己來儲存長度。

varchar能存的最大字元長度

理論上,varchar能夠儲存65535個位元組,但是由於首部會佔用兩個位元組,因此這會讓varchar可用的儲存空間變成了65533位元組。如果定義的列是非空話,那最大是65533,如果定義的列允許NULL,那麼null會佔用一個額外的位元組,因此最大隻能儲存65532個位元組。

位元組並不等於字元長度,varchar括號裡面跟著的是字元長度,如果字符集是utf8的話,每一個字元統一會佔用3個位元組的長度,不管是漢子還是英文字元,因此最大能夠儲存的長度是65533/3 = 21844。如果字符集是utf8mb4那最大儲存長度就更小了,為65533/4=16383。

試驗驗證UTF8下的最大長度

連線mysql,輸入status,看到環境中mysql版本是5.6.34。

先建立一個測試的資料庫

mysql> create database imhuchao default charset utf8;
Query OK, 1 row affected (0.00 sec)

建立一個含有varchar列的表,試試65535.

mysql> create table test(v1 varchar(65535) not null);
ERROR 1074 (42000): Column length too big for column 'v1' (max = 21845); use BLOB or TEXT instead

很顯然,這樣會出錯。提示我們最大為21845,這個只是簡單的用65535/3計算了一下,這是不準確的。我們用21845的話,很明顯這還是錯誤的。

mysql> create table test(v1 varchar(21845) not null);
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

mysql的行大小最大為65535,很明顯21845*3+2已經超過了這個大小。因此如果是utf8字符集,varchar能存的字元個數最多隻有21844

mysql> create table test(v1 varchar(21844) not null);
Query OK, 0 rows affected (0.01 sec)

試驗驗證latin1下的最大長度

定義一個非空列,看看最大長度

mysql> create table test2(v1 varchar(65533) not null) default charset latin1;
Query OK, 0 rows affected (0.02 sec)

很明顯,65533是可以達到的。

如果允許空的話,那將會出錯

mysql> create table test3(v1 varchar(65533)) default charset latin1;
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

允許空值,最大隻能到65532

mysql> create table test3(v1 varchar(65532)) default charset latin1;
Query OK, 0 rows affected (0.01 sec)

======

mysql每行最大隻能存65535個位元組。假設是utf-8編碼,每個字元佔3個位元組。varchar儲存最大字元數為(65535-2-1)/3=21844。

驗證:

新建表只有一個欄位name。最大隻能為21844=65532/3個字元。存21845會報錯。

 再新建一個欄位設定最小為1。報錯:

 行最大表示已被佔用,無法繼續建立欄位。