mysql 文本類型 深度解析

  • varchar(n),n表示什麼?

  •  

MySQL5.0.3之前varchar(n)這裏的n表示字節數,n的最大值是65332

MySQL5.0.3之後varchar(n)這裏的n表示字符數,比如varchar(200),不管是英文還是中文都可以存放200個,但存儲空間不變,所以n的最大值比65332小得多

mysql一般用varchar存儲文本類型,長度定義爲varchar(n),那麼n的最大值是多少呢?

結論

如果編碼是utf-8,n 最大爲21844=65532/3(個字符),如果編碼是gbk,n 最大爲32766=65532/2(個字符)

n的值不是越大越好,因爲一條記錄中varchar字段存儲字符數量之和是21844,太大會影響後面的(varchar)字段,如果是大本文,請用text或blob,

  • 如果需要存儲超長文本,考慮使用 text 類型,只存儲指針長度

他們能存64kb-4GB,但在該條記錄中只佔5-9字節,(1kb=1024字節)

分析過程

MySQL要求一個行定義長度不能超過 65535 bytes(64kb)(所有字符串類型字段包括其字段名稱佔用空間都計算在內, text、blob等大字段類型除外)

衆所周知,一條記錄就是一行數據,比如說某個表有n個varchar類型的字段,那麼這n個字段存儲空間之和不能超過65535字節

但是 varchar 保存時用一個字節或兩個字節長的前綴+數據。如果 varchar 列聲明的長度大於 255,長度前綴是兩個字節,所以 varchar 的最大長度應爲:

65532=65535-1-2(字節)
utf-8 下爲 21844=65532/3(個字符)

測試環境:MySQL版本 5.7.19

//首先要設置下 mysql 爲嚴格執行模式,不然 varchar 超出最大長度爲自動轉爲 text 類型
set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

運行sql 

建表sql

CREATE TABLE test11(
    va VARCHAR(21844)
)DEFAULT CHARSET=utf8;

varchar(n)+text ,此時n最大值是?

每個 BLOB 和 TEXT 列只佔其中的 5 至 9 個字節。

BLOB 和 TEXT 類型需要 1、2、3 或者 4 個字節來記錄列值的長度,取決於該類型的最大可能的長度。

那麼就是至少需要 10 字節(9+1)的空間了,再試一下:

[SQL]
CREATE TABLE test1(
    va VARCHAR(21840),
    tx text
)DEFAULT CHARSET=utf8;
Query OK, 0 rows affected

這裏看到,當 va 字段騰出 12 字節的空間時,表可以創建成功

 

如果遇到了大文本,考慮使用 text,最大能到 4G。效率來說基本是 char>varchar>text,但是如果使用的是 Innodb 引擎的話,推薦使用 varchar 代替 char。char 和 varchar 可以有默認值,text 不能指定默認值

 

MySQL大文本存儲類型

 

可以使用TEXT,BLOB倆種類型來存儲長文本。

1. TEXT

 

TEXT有4有類型:

TINYTEXT 256bytes

TEXT 64kb

MEDIUMTEXT 16Mb

LONGTEXT 4GB

2. BLOB

 

TINYBLOB

BLOB、

MEDIUMBLOB

LONGBLOB

blob 保存的是二進制數據,利用這個特性,可以把圖片存儲到數據庫裏面。text只能存儲文本。

長使用的是text的,因爲blob存儲的是二進制格式,所以長文本里面的搜有數據都是二進制數據,在上傳圖文的時候,傳過來是String,保存起來,讀取都需要轉換,還有javaBean設計的時候也要把文本的類型弄成BLOB類型,在加上hibernate 4 ,生成blob對象還要LobHelper,各種麻煩,於是就使用text來存儲。



作者:孟琬晶1528424003
鏈接:https://www.jianshu.com/p/fe9977be793e
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

 

爲什麼mysql的varchar字符長度會被經常性的設置成255

很多時候我們設置varchar(255)都習以爲常了,甚至我還遇到過有人以爲varchar不能設置超過255的人。其實varchar沒有明確最大長度,然後有人說那65535字節(bytes)不是嗎?

但是事實上如果你用的 utf8 編碼的話按理最大可以設置到 varchar(21845),但是其實一般都會說你超出。其實MySQL要求一個行定義長度不能超過 65535 bytes(所有字符串類型字段包括其字段名稱佔用空間都計算在內, text、blob等大字段類型除外)。

如下圖我先設置了個21842成功了,後面加個長度爲3的varchar都會報錯,所有如果一個表有很多varchar字段的時候,不應該把varchar設置的特別大,會影響後面的字段


言歸正傳那爲什麼我們會經常性設置成varchar(255)呢?

首先我們要知道一個概念:InnoDB存儲引擎的表索引的前綴長度最長是767字節(bytes)

你如果需要建索引,就不能超過 767 bytes;utf8編碼時 255*3=765bytes ,恰恰是能建索引情況下的最大值。

如果像lavavel5.3往後 使用的是utf8mb4編碼,默認字符長度則應該是 767除以4向下取整,也就是191。

總結:varchar(255) 不是最優的字符長度,最優還是應該根據實際需要的來。但是這是一個保證你能少出錯的一個很好的默認值
————————————————
版權聲明:本文爲CSDN博主「一江黑白」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/w790634493/article/details/80650611


一個比較詳細的文章:MySQL字段類型

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