mysql 中 varchar 和 text 的區別

varchar 數據類型

如何理解 varchar(50)

varchar(50) 中的 50 在 mysql5.0 及以上默認是存儲的字符數,5.0 以下,默認是字節長度。

varchar 占據的存儲空間

varchar 占據的存儲空間大概有以下幾部分組成:

  • varchar 類型用來存儲【實際字符有多少個】這條信息的存儲空間。
  • 用來存儲實際字符內容的存儲空間,比如對于 utf-8 編碼,每個字符可能占用 1 - 4 個字節,實際有 3 個字符(且每個字符占 3 個字節),那么這部分要占用的存儲空間為 3 字符 x 3 字節/字符 = 9 字節。

varchar 最大支持的是 65535 個字節而不是字符

VARCHAR 能存儲的最大長度會因為你在表定義中使用的字符集不同而發生變化,以 utf-8 為例:

mysql> create table varchar_test2(col_1 varchar(65535))charset=utf8 engine=innodb;
ERROR 1074 (42000): Column length too big for column 'col_1' (max = 21845); use BLOB or TEXT insteadmysql> create table varchar_test2(col_1 varchar(21845))charset=utf8 engine=innodb;
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 BLOBsmysql> create table varchar_test2(col_1 varchar(21844))charset=utf8 engine=innodb;
Query OK, 0 rows affected (0.02 sec)

因此在使用了 UTF-8 的字符集時,VARCHAR 的最大長度為 21844。

ps:我實際測下來只有最大僅支持 16383。

如何選擇合適的 varchar 字符長度

在保留一定冗余的前提下,不要給 varchar 設置過大的字符長度

雖然使用 VARCHAR (50)VARCHAR (1000) 存儲‘abcd’的存儲空間開銷是一樣的,但是當你在讀取數據時,把這些數據讀取到內存的過程中,MySQL 數據庫需要分配相應大小的內存空間來存放數據。

所以更大的 VARCHAR 列在讀取時要使用更大的內存空間,即使它實際上只存儲了一丁點數據。

并且在操作這個表的過程中,如果遇到一些聚合(GROUP BY)或排序(ORDER BY)的操作,需要調用內存臨時表或磁盤臨時表時,性能會更加糟糕。

除此之外給 varchar 設置過大的字符長度還會帶來一些其他問題:

  • 導致行溢出,而行溢出的數據在讀取時需要多一個 IO 操作,也會造成 InnoDB 表空間越來越大。
  • InnoDB 中的大字段在做更新和刪除操作時,只能進行悲觀操作,這會造成并發性能下降。
  • MySQL 中的最大行長度是 65535 字節,包含所有類型的列,因此不可能讓一個 varchar 類型的字段把空間都占了的。

補充:另外,因為 InnoDB 的數據頁默認是 16K,每個頁中至少存放 2 行數據,因此建議 VARCHAR 字段的總長度不要超過 8K。

varchar 和 text 的區別

  • VARCHAR:
    • 存儲在 VARCHAR 類型字段中的數據是按照實際長度存儲
    • 在某些情況下,VARCHAR 可能會占用更少的存儲空間,因為它只存儲實際使用的字節數。
  • TEXT:
    • TEXT 是用于存儲大塊文本數據的數據類型,可以存儲最大長度為 64KB 的數據。
    • TEXT 類型的字段占用固定的存儲空間
    • TEXT 數據在存儲時會進行額外的處理和管理,因此可能會有輕微的性能開銷。

總的來說,如果您需要存儲較小的文本數據,VARCHAR 可能在性能方面更優,因為它占用的存儲空間可能會較小。但是需要注意的是,當數據超過了 VARCHAR 定義的長度時,會進行截斷處理,導致部分數據丟失。

如果您需要存儲大塊的文本數據,或者數據的長度不確定,使用 TEXT 類型更為合適。TEXT 類型不會對數據進行截斷處理,并且為了性能更好地處理文本數據,還可以結合使用全文索引等技術。

參考

  • https://www.imooc.com/read/88/article/2357

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160173.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160173.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python入門教學——輸入任意長度的int整型一維數組

使用python輸入一個任意長度的整型一維數組: nums input("請輸入整數數組,用空格分隔: ") nums [int(i) for i in nums.split( )] # 將每個數轉換為整型后輸出 運行結果: 【注】如果不強制轉換類型,數字…

功能測試進階建議,學習思路講解

1. 深入了解測試理論: 了解測試的原理、方法和最佳實踐,包括黑盒測試、白盒測試、灰盒測試等。可以閱讀相關的書籍或參加在線課程。 2. 學習相關測試工具: 掌握常用的測試工具,如缺陷發現工具、性能測試工具、安全測試工具等。可以…

matlab求矩陣的偽逆或者負二分之一次方

如果X不是滿秩矩陣的時候,那么不能使用inv()函數來求X的逆,因為X此時不存在逆,但是我們可以求X的偽逆。 (1)有以下兩種方法求X的偽逆: 假設 X[1 2 1;1 2 1;2 3 4]; 1, pinvXpinv(X); 2, [U,D,P]svd(X); r…

如何使用YOLOv8代碼框架中的RT-DETR

1. RT-DETR RT-DETR是由由此,百度推出了——RT-DETR (Real-Time DEtection TRansformer) ,一種基于 DETR 架構的實時端到端檢測器,其在速度和精度上取得了 SOTA 性能。 RT-DETR開源的代碼在百度自己的飛槳paddlepaddle上,因此非…

基于天鷹算法優化概率神經網絡PNN的分類預測 - 附代碼

基于天鷹算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于天鷹算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于天鷹優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要:針對PNN神經網絡的光滑…

新手必看!!附源碼!!STM32通用定時器輸出PWM

一、什么是PWM? PWM(脈沖寬度調制)是一種用于控制電子設備的技術。它通過調整信號的脈沖寬度來控制電壓的平均值。PWM常用于調節電機速度、控制LED亮度、產生模擬信號等應用。 二、PWM的原理 PWM的基本原理是通過以一定頻率產生的脈沖信號&#xff0…

【5 樹與二叉樹】統計二叉樹結點值和。

typedef struct BiTNode{int data;struct BiTNode *lchild,*rchild; }*BiTree,BiTNode;int sum(BiTree T){if(Tnull)return 0;return T->datasum(T->lchild)sum(T->rchild); }

Android:Google三方庫之Firebase集成詳細步驟(二)

Analytics分析 1、將 Firebase 添加到您的 Android 項目(如果尚未添加),并確保在 Firebase 項目中啟用了 Google Analytics(分析): 如果您要創建新的 Firebase 項目,請在項目創建過程中啟用 G…

實時錯誤’-2147217887‘多步OLB DB 操作產生錯誤。如果可能,請檢查OLE DB狀態值

目錄 背景問題問題分析問題解決 錯誤解決與定位技巧總結 背景 仍舊是學生信息管理系統的問題,當時做的時候沒發現這么多問題呢,只能說明一件事,做的時候沒有站在用戶的角度考慮需求,設置了什么內容,就按照設置好的去測…

AIGC ChatGPT4總結SQL優化細節操作

數據庫SQL優化是一個復雜的過程,它通常涉及到許多不同的技術和方法。以下是一些常用的SQL優化策略: 1. **索引使用**:索引可以極大地加速查詢速度。但是,索引并不總是有好處的,因為它們需要額外的空間來存儲,并且在插入和更新數據時可能會減慢速度。因此,選擇正確的字段…

Unity中Shader紋理的過濾

文章目錄 前言一、為什么要過濾?二、過濾方式1、Point(no filter) 無過濾2、Bilinear 雙線性過濾3、Trilinear 三線性過濾 前言 Unity中Shader紋理的過濾 一、為什么要過濾? 事實上沒有一個紋理上的紋素是與屏幕上的像素是一一對應的。 屏幕上的 一個…

redis安裝(Windows和linux)

如何實現Redis安裝與使用的詳細教程 Redis 簡介 Redis是一個使用C語言編寫的開源、高性能、非關系型的鍵值對存儲數據庫。它支持多種數據結構,包括字符串、列表、集合、有序集合、哈希表等。Redis的內存操作能力極強,其讀寫性能非常優秀,且…

萬字解析:十大排序(直接插入排序+希爾排序+選擇排序+堆排序+冒泡排序+快速排序+歸并排序+計數排序+基數排序+桶排序)

文章目錄 十大排序排序算法復雜度及穩定性分析一、 排序的概念1.排序:2.穩定性:3.內部排序:4.外部排序: 二、插入排序1.直接插入排序2.希爾排序 三、選擇排序1.直接選擇排序方法一方法二直接插入排序和直接排序的區別 2.堆排序 四…

【藍橋杯省賽真題45】Scratch九宮格游戲 藍橋杯scratch圖形化編程 中小學生藍橋杯省賽真題講解

目錄 scratch九宮格游戲 一、題目要求 編程實現 二、案例分析 1、角色分析

輕量封裝WebGPU渲染系統示例<37>- 多個局部點光源應用于非金屬材質形成的效果(源碼)

當前示例源碼github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialMultiLights.ts 當前示例運行效果: 此示例基于此渲染系統實現,當前示例TypeScript源碼如下: export class BasePbrMaterial…

2023年09月 Scratch(二級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 點擊綠旗,運行程序后,舞臺上的圖形是?( ) A:畫筆粗細為4的三角形 B:畫筆粗細為5的六邊形 C:畫筆粗細為4的六角形 D:畫筆粗細為5的三角形 答案:D 第2題 如下圖所示,從所給…

緩存雪崩、擊穿、穿透_解決方案

文章目錄 緩存雪崩、擊穿、穿透1.緩存雪崩造成緩存雪崩解決緩存雪崩 2. 緩存擊穿造成緩存擊穿解決緩存擊穿 3.緩存穿透造成緩存穿透解決緩存穿透 緩存雪崩、擊穿、穿透 一般用戶數據存儲于磁盤,讀寫速度慢。 使用redis作為緩存,相當于數據緩存在內存&a…

GZ031 應用軟件系統開發賽題第1套

2023年全國職業院校技能大賽 應用軟件系統開發賽項(高職組) 賽題第1套 工位號: 2023年4月 競賽說明 一、項目背景 黨的二十大報告指出,要加快建設制造強國、數字中國,推動制造業高端化、智能化、綠色化發展。《IDC中國制造企業調研報告,2021》報告指…

SpringBoot學習筆記-實現微服務:匹配系統(上)

筆記內容轉載自 AcWing 的 SpringBoot 框架課講義,課程鏈接:AcWing SpringBoot 框架課。 CONTENTS 1. 配置WebSocket2. 前后端WebSocket通信2.1 WS通信的建立2.2 加入JWT驗證 3. 前后端匹配業務3.1 實現前端頁面3.2 實現前后端交互邏輯3.3 同步游戲地圖 …

年底了,我勸大家真別輕易離職...

年底了,一些不滿現狀,被外界的“高薪”“好福利”吸引的人,一般就在這時候毅然決然地跳槽了。 在此展示一套學習筆記 / 面試手冊,年后跳槽的朋友可以好好刷一刷,還是挺有必要的,它幾乎涵蓋了所有的軟件測試…