MySQL的char與varchar詳解

2021-01-07 一入代碼深似海

本位基於MySQL5.7.24。CHAR和VARCHAR都可以用來表示字符類型,其不同在於兩者的存儲與檢索、最大長度和尾部空格串的處理等方面。

1 基礎總結

下表是CHAR和CARCHAR的知識總結:

char與varchar的基礎總結

以下幾點需要特別引起注意:

1> 雖然在聲明時,兩種類型的m都可以指定為0,實際上最長長度為0隻能存放空字符串。

2> 關於長度範圍,CHAR在聲明時,m只能是0~255之間的數字;VARCHAR在聲明時,m只能是0~4294967295範圍的數字。

2 存儲

CHAR是定長字符串類型,在聲明時指定其長度m,在進行數據寫入時,如果寫入的字符串未達到指定長度m,那麼會在左側使用空格補齊到長度m,所以,聲明為m長度的CHAR類型,不論其存放的字符串長短,統一都會佔用m字節。

VARCHAR是變長字符串類型,在聲明時雖然指定其長度m,僅指其能存放字符串的最長長度,在存儲時,如果存放的字符串長度不超過255,VARCHAR會額外申請一個字節用於存放實際字符串的長度,如果超過255,會額外申請兩個字節的空間用於存放實際字符串的長度,所以根據VARCHAR實際存放的字符長度不同,其所佔空間也會不同。例如在CHAR(4)和VARCHAR(4)中存放不同數據類型,其結果如下表所示:

char與varchar的存儲

上表中最後一行,展示了當存儲字符串超出其聲明的最大長度時的提現,如果sql_mode未使用嚴格模式,則會如上表所示的樣子,按最大長度截取,但是會產生警告;如果設置了嚴格模式,則會報錯,如下圖所示:

超長字符串的裁剪

Char類型的數據在存儲時會自動裁剪右側的空格串,而VARCHAR則不會,如下圖所示:

右側空格串的裁剪

為了使結果更明顯,上圖中使用concat對輸出結果進行了調整,可以看到CHAR在存儲時,自動裁剪了右側的空格串。

3 數據的校驗

CHAR、VARCHAR(以及TEXT)類型在進行比較時,會自動裁剪後側的空格串,然後進行比較,如下圖所示:

字符串的校驗1

對於此規則,如果在該類型的列上有唯一索引,那麼插入裁剪右側空格串後相同的字符串會報錯。

如果需要將右側的空格字符串參與比較,使用like即可,如下圖所示:

字符串的比較校驗2

4 總結

本文總結梳理了MySQL資料庫char與varchar類型的知識並給出了相應樣例,在實際應用中如何選擇合適的數據類型是非常重要的,其最重要的區別在於定長與變長,一般來說,能適用於char的地方varchar一定可以使用。

如提前知道需要存放的數據內容,如郵政編碼、彩票號碼等固定位數的字符串,則可以使用char類型,如不能確定長度的情況下,應該使用varchar。

在使用中藥注意超過最大長度和不到最大長度時兩種類型的不同處理。

對於字符串比較時的右側空格串裁剪規則要引起注意,不同字符串因比較結果相同可能會引發不明顯的錯誤結果。

相關焦點

  • MySQL - char 和 varchar
    通常理解 char 是定長字符類型,varchar 是變長字符類型。char 字符類型會用空格填充空餘的空間,varchar 保存的是實際長度的數據。這帶來的影響是,查詢 varchar 字符類型的數據要先提供變成欄位列表中的記錄得到這個數據的長度,而 char 字符類型的數據是定長,不需要單獨獲取,char 往往有著比 varchar 更好的讀寫效率,但是浪費一定存儲空間。
  • CHAR與VARCHAR面面觀
    下面我們簡單測試下:CREATE TABLE `char_tb1` ( `col1` char DEFAULT NULL, `col2` char(5) DEFAULT NULL, `col3` char(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;mysql> show
  • char 還是 varchar 各個資料庫都不同
    char 和varchar ,雖然我們要進行換的不是MySQL,但我在MySQL 模擬了一下場景。chchar和varchar 不管在Oracle 還是在MySQL 其基本是一樣的,都是字符串,但是又有些不一樣,MySQL根據sql_mode定義不同,char也可以等同於varchar如果你是Oracle DBA ,那問char 和varchar的不同 char(10)和varchar2(10)char(10) 即使插入不夠10 也佔有10個 ,而varchar2(
  • SQL Server中數據類型之char、nchar、varchar、nvarchar的用法
    今天在工作中,在向一個表中插入數據時,報『將截斷字符串或二進位數據』,然後排查出是因為數據類型建的不對,應該用nvarchar,但使用了varchar。基於此,就總結一下char、nchar、varchar、nvarchar的用法。
  • MSSQL數據類型-字符數據類型(char、nchar、varchar、nvarchar)
    字符數據類型包括char型、nchar型、varchar型和nvarchar型。 char型是固定長度的非Unicode字符數據類型,在存儲時每個字符和符號佔用一個字節的存儲空間。其定義形式為char[(n)],其中n表示所有字符所佔的存儲空間,取值為1~8000,即可容納8000個ANSI字符,4000個漢字,默認值為1。
  • MySQL教程之MySQL數據類型詳解
    ,datetime與timestamp能存儲的時間範圍也不同,datetime的存儲範圍為1000-01-01 00:00:00——9999-12-31 23:59:59,timestamp存儲的時間範圍為19700101080001——20380119111407datetime默認值為空,當插入的值為null時,該列的值就是null;timestamp默認值不為空,當插入的值為null的時候,mysql
  • mysql大表中count()的用法以及mysql中count()的優化
    本篇文章給大家帶來的內容是關於mysql大表中count()的用法以及mysql中count()的優化,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一個單表中包含有6000w+的數據,然而你又不能拆分.需要分別統計表中有多少數據,A產品有多少,B產品有多少這幾個數據.
  • MySQL--SQL的數據類型
    > use test02;Database changed創建一個新的表user_info,並制定 id 列為 int 型,name列為 varchar(10) 型,ID_Card為大整數,age為小整數型,身高為浮點型。
  • mysql和oracle語法異同
    一、mysql裡的ifnull(a,b)對應oracle的nvl(a,b);二、日期比較:mysql: 可以用Date類型的日期進行比較時間比較。oracle:必須用to_date()函數和to_char()函數配合轉換成統一格式的日期字符串,然後進行比較。
  • 原創MySql專題之第三篇--表的操作
    和char對比:都是字符串類型varchar比較智能,可以根據實際的數據長度分配空間,比較節省空間,但是在分配的時候需要執行相關的判斷程序,效率較低char若欄位中的數據不具備伸縮性,建議採用char類型存儲。若欄位中的數據具備很強的伸縮性,建議採用varchar類型存儲。
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    "table_title varchar(100) not null, ". "table_author varchar(40) not null, ". "submission_date DATE, ".
  • MySQL環境配置和入門講解!
    2.2 小數類型float(m,d):單精度,8位精度;m表示總個數,d表示小數位double(m,d):雙精度,16位精度;m表示總個數,d表示小數位decimal(m,d):定點數,m表示總長度,d表示小數位2.3 字符串類型用的最多的是char
  • 了解資料庫類型及MySQL資料庫常用命令行
    2、資料庫的分類(1) 關係型資料庫(sql資料庫):中型:mysql(埠號3306)、sql server大型:Oracle(埠號1521)(2) 非關係型資料庫(no-sql資料庫)>MongoDB、Redis3、mysql軟體:Sql yog:資料庫客戶端工具(圖形用戶界面工具)方便操作資料庫。
  • MySQL環境配置和10分鐘快速入門
    2.2 小數類型float(m,d):單精度,8位精度;m表示總個數,d表示小數位double(m,d):雙精度,16位精度;m表示總個數,d表示小數位decimal(m,d):定點數,m表示總長度,d表示小數位2.3 字符串類型用的最多的是char
  • 重新學習Mysql資料庫1:無廢話MySQL入門
    登錄MySQLmysql -h 127.0.0.1 -u 用戶名 -pmysql -D 所選擇的資料庫名 -h 主機名 -u 用戶名 -pmysql> exit # 退出 使用 「quit;」 或 「\q;」 一樣的效果mysql> status; # 顯示當前mysql的version的各種信息mysql> select version(); # 顯示當前
  • MySQL的主鍵命名挺任性,就這麼定了
    mysql> use testmysql> create table test_data2 (id int ,name varchar(30));Query OK, 0 rows affected (0.05 sec)接著創建一個主鍵
  • MySQL三天快速完整複習
    char和varchar怎麼選擇?在實際的開發中,當某個欄位中的數據長度不發生改變的時候,是定長的,例如:性別、生日等都是採用char。當一個欄位的數據長度不確定,例如:簡介、姓名等都是採用varchar。BLOB和CLOB類型的使用?
  • mysql的這幾個坑你踩過沒?真是防不勝防
    四、欄位長度我們在創建表的時候,給欄位定義完類型之後,緊接著需要指定欄位的長度,比如:varchar(20),biginit(20)等。那麼問題來了,varchar代表的是字節長度,還是字符長度呢?create table test_varchar(a varchar(20));insert into test_varchar values('蘇三說技術');select length(a),CHARACTER_LENGTH(a) from test_varchar;執行後的結果:
  • MySQL EXPLAIN 命令詳解學習
    (點擊上方公眾號,可快速關注)作者:黃杉blog.csdn.net/mchdba/article/details/9190771如有好文章投稿,請點擊 → 這裡了解詳情MySQL EXPLAIN 命令詳解