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。報錯:

 

 行最大表示已被佔用,無法繼續創建字段。

 參考:

http://imhuchao.com/1657.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章