首頁 資料庫 mysql教程 MySQL中CHAR和VARCHAR的差別

MySQL中CHAR和VARCHAR的差別

Apr 30, 2020 am 11:07 AM
mysql

前述

VARCHAR和CHAR是兩個最主要的字串型別。不幸的是,很難精確地解釋這些值是如何儲存在磁碟和記憶體中的,因為這與儲存引擎的具體實作有關。下面的描述假設使用的儲存引擎是InnoDB和/或MyISAM。如果使用的不是這兩種儲存引擎,請參考所使用的​​儲存引擎的文件。

先看看VARCHAR和CHAR值通常在磁碟上怎麼儲存。請注意,儲存引擎儲存CHAR或VARCHAR值的方式在記憶體中和在磁碟上可能不一樣,所以MySQL伺服器從儲存引擎讀出的值可能需要轉換成另一種儲存格式。

VARCHAR類型

VARCHAR類型用於儲存可變長字串,是最常見的字串資料型別。它比定長類型更節省空間,因為它只使用必要的空間(例如,越短的字串使用越少的空間)。有一種情況例外,如果MySQL表使用ROW_FORMAT=FIXED創建的話,每一行都會使用定長存儲,這會很浪費空間。

VARCHAR需要使用1或2個額外位元組記錄字串的長度:如果列的最大長度小於或等於255位元組,則只使用1個位元組表示,否則使用2個位元組。假設採用latin1字元集,一個VARCHAR(10)的欄位需要11個位元組的儲存空間。 VARCHAR(1000)的欄位則需要1002個位元組,因為需要2個位元組儲存長度資訊。

VARCHAR節省了儲存空間,所以對效能也有幫助。但是,由於行是變長的,在UPDATE時可能會使行變得比原來更長,這就導致需要做額外的工作。如果一個行佔用的空間增長,並且在頁內沒有更多的空間可以存儲,在這種情況下,不同的存儲引擎的處理方式是不一樣的。例如,MyISAM會將行拆成不同的片段存儲,InnoDB則需要分裂頁來使行可以放進頁內。其他一些儲存引擎也許從不在原始資料位置更新資料。

VARCHAR適用情況

下面這些情況下適用VARCHAR是適當的:

字串列的最大長度比平均長度大很多

列的更新很少,所以碎片不是問題

使用了像UTF-8這樣複雜的字元集,每個字元都使用不同的位元組數進行儲存

#CHAR類型

CHAR類型是定長的:MySQL總是根據定義的字串長度分配足夠的空間。當儲存CHAR值時,MySQL會刪除所有的末尾空格。 CHAR值會根據需要採用空格進行填充以方便比較。

CHAR適合儲存很短的字串,或是所有值都接近同一個長度。例如,CHAR非常適合儲存密碼的MD5值,因為這是一個定長的值。對於經常變更的數據,CHAR也比VARCHAR更好,因為定長的CHAR類型不容易產生碎片。對於非常短的資料列,CHAR比VARCHAR在儲存空間上也更有效率。例如用CHAR(1)來儲存只有Y和N的值,如果採用單字節字元集只需要一個位元組,但是VARCHAR(1)卻需要兩個位元組,因為還有一個記錄長度的額外位元組。

測試

下面透過範例來具體說明CHAR與VARCHAR行為上的不同,首先,我們建立一張只有一個CHAR(10)欄位的表,並且在裡面插入一些值:

CREATE TABLE char_test
(
    char_col CHAR(10)
);
 
INSERT INTO char_test 
VALUES
    ('string1').
    ('  string2').
    ('string3  ');
登入後複製

當我們檢索這些值的時候,會發現string3末尾的空格被截斷了。

SELECT CONCAT("'", char_col, "'")
FROM char_test;
登入後複製

執行結果:

 MySQL中CHAR和VARCHAR的差別

如果用VARCHAR(10)欄位儲存相同的值,可以得到下列結果:

CREATE TABLE varchar_test
(
    varchar_col VARCHAR(10)
);
 
INSERT INTO varchar_test 
VALUES
    ('string1').
    ('  string2').
    ('string3  ');
 
SELECT CONCAT("'", varchar_col, "'")
FROM varchar_test;
登入後複製

執行結果

 MySQL中CHAR和VARCHAR的差別

VARCHAR(5)與VARCHAR(200)的差異

我們倘若用VARCHAR(5)和VARCHAR(200 )來儲存'hello',我們知道這兩者的空間開銷是一樣的。那我們可以讓VARCHAR的長度始終保持很大嗎?使用更短的列有什麼優勢嗎?

事實證明有很大的優勢。更長的列會消耗更多的內存,因為MySQL通常會分配固定大小的記憶體區塊來保存內部值。尤其是使用記憶體臨時表進行排序或操作時會特別糟糕。在利用磁碟臨時表進行排序時也同樣糟糕。

所以最好的策略是只分配真正需要的空間。

總結

當我們為字串型別的欄位選取類型的時候,判斷該選取VARCHAR或CHAR,我們可以從以下幾個方面來考慮:

該欄位資料集的平均長度與最大長度是否相差很小,若相差很小優先考慮CHAR類型,反之,考慮VARCHAR類型。

若欄位儲存的是MD5後的雜湊值,或一些定長的值,優先選取CHAR類型。

若欄位經常需要更新,優先考慮CHAR類型,由於CHAR類型為定長,因此不容易產生碎片。

對於欄位值儲存很小的信息,如性別等,優先選取CHAR類型,因為VARCHAR類型會佔用額外的位元組保存字串長度資訊。

總之一句話,當我們能夠選取CHAR類型的時候,或是空間消耗相對不是影響因素的重點時,盡量選取CHAR類型,因為在其他方面,CHAR類型都有著或多或少的優勢。而當空間消耗成為了很大的影響因素以後,我們則考慮使用VARCHAR類型。

推薦教學:《Mysql教學

###

以上是MySQL中CHAR和VARCHAR的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

初學者的MySQL:開始數據庫管理 初學者的MySQL:開始數據庫管理 Apr 18, 2025 am 12:10 AM

MySQL的基本操作包括創建數據庫、表格,及使用SQL進行數據的CRUD操作。 1.創建數據庫:CREATEDATABASEmy_first_db;2.創建表格:CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(100)NOTNULL,authorVARCHAR(100)NOTNULL,published_yearINT);3.插入數據:INSERTINTObooks(title,author,published_year)VA

解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 Apr 18, 2025 am 08:42 AM

在使用Thelia開發電商網站時,我遇到了一個棘手的問題:MySQL模式設置不當,導致某些功能無法正常運行。經過一番探索,我找到了一個名為TheliaMySQLModesChecker的模塊,它能夠自動修復Thelia所需的MySQL模式,徹底解決了我的困擾。

See all articles